@@ -285,6 +285,57 @@ mod high_cases {
285285 test_utils:: cleanup_storage ( ) ;
286286 }
287287
288+ #[ test]
289+ pub fn add_request_works_for_spent_utxo ( ) {
290+ test_utils:: cleanup_storage ( ) ;
291+ plugin:: init_plugin ( ) ;
292+ let wallet_handle = wallet:: create_and_open_wallet ( ) . unwrap ( ) ;
293+ let pool_handle = pool:: create_and_open_pool_ledger ( POOL_NAME ) . unwrap ( ) ;
294+
295+ let ( trustee_did, _) = did:: create_and_store_my_did ( wallet_handle, Some ( TRUSTEE_SEED ) ) . unwrap ( ) ;
296+ let ( my_did, my_vk) = did:: create_and_store_my_did ( wallet_handle, None ) . unwrap ( ) ;
297+ let ( my_did_2, my_vk_2) = did:: create_and_store_my_did ( wallet_handle, None ) . unwrap ( ) ;
298+ let nym_req = ledger:: build_nym_request ( & trustee_did, & my_did, & my_vk, "aaa" , "TRUSTEE" ) . unwrap ( ) ;
299+ let nym_req_2 = ledger:: build_nym_request ( & trustee_did, & my_did_2, & my_vk_2, "aaa" , "TRUSTEE" ) . unwrap ( ) ;
300+
301+ let addresses = payments_utils:: create_addresses ( vec ! [ "{}" , "{}" ] , wallet_handle, PAYMENT_METHOD_NAME ) ;
302+
303+ let mint: Vec < ( String , i32 , Option < & str > ) > = addresses. clone ( ) . into_iter ( ) . enumerate ( ) . map ( |( i, addr) | ( addr, ( ( i+3 ) * 10 ) as i32 , None ) ) . collect ( ) ;
304+ payments_utils:: mint_tokens ( mint, wallet_handle, pool_handle, my_did. as_str ( ) ) ;
305+
306+ payments_utils:: set_request_fees ( wallet_handle, pool_handle, SUBMITTER_DID , PAYMENT_METHOD_NAME , r#"{"1": 10, "101": 10}"# ) ;
307+
308+ let utxos = payments_utils:: get_utxos_with_balance ( addresses. clone ( ) , wallet_handle, pool_handle, SUBMITTER_DID ) ;
309+
310+ let addr_1 = addresses. get ( 0 ) . unwrap ( ) ;
311+ let utxos_1: Vec < String > = utxos. get ( addr_1. as_str ( ) ) . unwrap ( ) . into_iter ( ) . map ( |info| info. txo . clone ( ) ) . collect ( ) ;
312+ let inputs = serde_json:: to_string ( & utxos_1) . unwrap ( ) ;
313+
314+ let outputs = vec ! [ UTXOOutput {
315+ payment_address: addresses. get( 1 ) . unwrap( ) . to_string( ) ,
316+ amount: 19 ,
317+ extra: None
318+ } , UTXOOutput {
319+ payment_address: addresses. get( 0 ) . unwrap( ) . to_string( ) ,
320+ amount: 1 ,
321+ extra: None
322+ } ] ;
323+ let outputs = serde_json:: to_string ( & outputs) . unwrap ( ) ;
324+
325+ let ( nym_req_with_fees, payment_method) = payments:: add_request_fees ( wallet_handle, SUBMITTER_DID , nym_req. as_str ( ) , inputs. as_str ( ) , outputs. as_str ( ) ) . unwrap ( ) ;
326+ let nym_resp = ledger:: sign_and_submit_request ( pool_handle, wallet_handle, trustee_did. as_str ( ) , nym_req_with_fees. as_str ( ) ) . unwrap ( ) ;
327+ payments:: parse_response_with_fees ( payment_method. as_str ( ) , nym_resp. as_str ( ) ) . unwrap ( ) ;
328+
329+ let ( nym_req_with_fees_2, payment_method) = payments:: add_request_fees ( wallet_handle, SUBMITTER_DID , nym_req_2. as_str ( ) , inputs. as_str ( ) , outputs. as_str ( ) ) . unwrap ( ) ;
330+ let nym_resp_2 = ledger:: sign_and_submit_request ( pool_handle, wallet_handle, trustee_did. as_str ( ) , nym_req_with_fees_2. as_str ( ) ) . unwrap ( ) ;
331+ let ec = payments:: parse_response_with_fees ( payment_method. as_str ( ) , nym_resp_2. as_str ( ) ) . unwrap_err ( ) ;
332+ assert_eq ! ( ec, ErrorCode :: PaymentSourceDoesNotExistError ) ;
333+
334+ pool:: close ( pool_handle) . unwrap ( ) ;
335+ wallet:: close_wallet ( wallet_handle) . unwrap ( ) ;
336+ test_utils:: cleanup_storage ( ) ;
337+ }
338+
288339 #[ test]
289340 pub fn add_request_fees_works_for_utxo_not_correspond_to_wallet ( ) {
290341 test_utils:: cleanup_storage ( ) ;
@@ -450,6 +501,50 @@ mod high_cases {
450501 test_utils:: cleanup_storage ( ) ;
451502 }
452503
504+ #[ test]
505+ pub fn payments_work_for_spent_utxo ( ) {
506+ test_utils:: cleanup_storage ( ) ;
507+ plugin:: init_plugin ( ) ;
508+ let wallet_handle = wallet:: create_and_open_wallet ( ) . unwrap ( ) ;
509+ let pool_handle = pool:: create_and_open_pool_ledger ( POOL_NAME ) . unwrap ( ) ;
510+
511+ let addresses = payments_utils:: create_addresses ( vec ! [ "{}" , "{}" ] , wallet_handle, PAYMENT_METHOD_NAME ) ;
512+
513+ let mint: Vec < ( String , i32 , Option < & str > ) > = addresses. clone ( ) . into_iter ( ) . enumerate ( ) . map ( |( i, addr) | ( addr, ( ( i + 2 ) * 10 ) as i32 , None ) ) . collect ( ) ;
514+ payments_utils:: mint_tokens ( mint, wallet_handle, pool_handle, SUBMITTER_DID ) ;
515+
516+ let utxos = payments_utils:: get_utxos_with_balance ( addresses. clone ( ) , wallet_handle, pool_handle, SUBMITTER_DID ) ;
517+
518+ let addr_1 = addresses. get ( 0 ) . unwrap ( ) ;
519+ let utxos_1: Vec < String > = utxos. get ( addr_1. as_str ( ) ) . unwrap ( ) . into_iter ( ) . map ( |info| info. txo . clone ( ) ) . collect ( ) ;
520+ let inputs = serde_json:: to_string ( & utxos_1) . unwrap ( ) ;
521+
522+ let outputs = vec ! [ UTXOOutput {
523+ payment_address: addresses. get( 1 ) . unwrap( ) . to_string( ) ,
524+ amount: 19 ,
525+ extra: None
526+ } , UTXOOutput {
527+ payment_address: addresses. get( 0 ) . unwrap( ) . to_string( ) ,
528+ amount: 1 ,
529+ extra: None
530+ } ] ;
531+ let outputs = serde_json:: to_string ( & outputs) . unwrap ( ) ;
532+
533+ let ( payment_req, payment_method) = payments:: build_payment_req ( wallet_handle, SUBMITTER_DID , inputs. as_str ( ) , outputs. as_str ( ) ) . unwrap ( ) ;
534+ let payment_resp = ledger:: submit_request ( pool_handle, payment_req. as_str ( ) ) . unwrap ( ) ;
535+ payments:: parse_payment_response ( payment_method. as_str ( ) , payment_resp. as_str ( ) ) . unwrap ( ) ;
536+
537+ let ( payment_req, payment_method) = payments:: build_payment_req ( wallet_handle, SUBMITTER_DID , inputs. as_str ( ) , outputs. as_str ( ) ) . unwrap ( ) ;
538+ let payment_resp = ledger:: submit_request ( pool_handle, payment_req. as_str ( ) ) . unwrap ( ) ;
539+ let ec = payments:: parse_payment_response ( payment_method. as_str ( ) , payment_resp. as_str ( ) ) . unwrap_err ( ) ;
540+
541+ assert_eq ! ( ec, ErrorCode :: PaymentSourceDoesNotExistError ) ;
542+
543+ pool:: close ( pool_handle) . unwrap ( ) ;
544+ wallet:: close_wallet ( wallet_handle) . unwrap ( ) ;
545+ test_utils:: cleanup_storage ( ) ;
546+ }
547+
453548 #[ test]
454549 pub fn payment_request_works_for_utxo_not_correspond_to_wallet ( ) {
455550 test_utils:: cleanup_storage ( ) ;
0 commit comments