@@ -214,6 +214,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
214214
215215 let run ~config :({ Test_config. signature_kind; _ } as config ) network t =
216216 let open Malleable_error.Let_syntax in
217+ let constraint_constants = Network. constraint_constants network in
217218 let logger = Logger. create () in
218219 let all_mina_nodes = Network. all_mina_nodes network in
219220 let % bind () =
@@ -278,12 +279,9 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
278279 Signed_command. sign_payload ~signature_kind sender.private_key payload
279280 |> Signature.Raw. encode
280281 in
282+ let zkapp_account_keypair = Signature_lib.Keypair. create () in
281283 let % bind.Async. Deferred zkapp_command_create_accounts =
282284 (* construct a Zkapp_command.t *)
283- let zkapp_keypairs =
284- List. init 3 ~f: (fun _ -> Signature_lib.Keypair. create () )
285- in
286- let constraint_constants = Network. constraint_constants network in
287285 let amount = Currency.Amount. of_mina_int_exn 10 in
288286 let nonce = Account.Nonce. zero in
289287 let memo =
@@ -296,7 +294,7 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
296294 ; fee
297295 ; fee_payer = None
298296 ; amount
299- ; zkapp_account_keypairs = zkapp_keypairs
297+ ; zkapp_account_keypairs = [ zkapp_account_keypair ]
300298 ; memo
301299 ; new_zkapp_account = true
302300 ; snapp_update = Account_update.Update. dummy
@@ -307,7 +305,6 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
307305 Transaction_snark.For_tests. deploy_snapp ~constraint_constants
308306 zkapp_command_spec
309307 in
310-
311308 let % bind zkapp_command_update_vk_proof, zkapp_command_update_vk_impossible =
312309 let snapp_update =
313310 { Account_update.Update. dummy with
@@ -357,6 +354,25 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
357354 in
358355 (vk_proof, vk_impossible)
359356 in
357+ let (zkapp_command_spec
358+ : Transaction_snark.For_tests.Multiple_transfers_spec. t ) =
359+ let amount = Currency.Amount. of_mina_int_exn 1 in
360+ let memo = Signed_command_memo. empty in
361+ { sender = (zkapp_account_keypair, Account.Nonce. zero)
362+ ; fee = Currency.Fee. of_nanomina_int_exn 1_000_000
363+ ; fee_payer = None
364+ ; receivers = [ (receiver_pub_key, amount) ]
365+ ; amount
366+ ; zkapp_account_keypairs = []
367+ ; memo
368+ ; new_zkapp_account = false
369+ ; snapp_update = Account_update.Update. dummy
370+ ; call_data = Snark_params.Tick.Field. zero
371+ ; events = []
372+ ; actions = []
373+ ; preconditions = None
374+ }
375+ in
360376 let wait_for_zkapp zkapp_command =
361377 let with_timeout =
362378 let soft_slots = 4 in
@@ -452,6 +468,133 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
452468 frontier"
453469 (wait_for_zkapp zkapp_command_create_accounts)
454470 in
471+ let % bind () =
472+ let zkapp_txn_expired_before_fork =
473+ Transaction_snark.For_tests. multiple_transfers ~constraint_constants
474+ { zkapp_command_spec with
475+ preconditions =
476+ Some
477+ { network = Zkapp_precondition.Protocol_state. accept
478+ ; account = Zkapp_precondition.Account. accept
479+ ; valid_while =
480+ Check
481+ Zkapp_precondition.Closed_interval.
482+ { lower = Global_slot_since_genesis. zero
483+ ; upper = Global_slot_since_genesis. of_int 400000
484+ }
485+ }
486+ }
487+ in
488+ section_hard " send a zkapp command that's expired before the fork"
489+ @@ send_invalid_zkapp ~logger
490+ (Network.Node. get_ingress_uri node_b)
491+ zkapp_txn_expired_before_fork " Expired"
492+ in
493+ let % bind () =
494+ let % bind global_slot_since_hard_fork =
495+ Integration_test_lib. Graphql_requests
496+ .must_get_global_slot_since_hard_fork ~logger
497+ (Network.Node. get_ingress_uri node_b)
498+ in
499+ let zkapp_txn_expired_before_fork =
500+ Transaction_snark.For_tests. multiple_transfers ~constraint_constants
501+ { zkapp_command_spec with
502+ preconditions =
503+ Some
504+ { network = Zkapp_precondition.Protocol_state. accept
505+ ; account = Zkapp_precondition.Account. accept
506+ ; valid_while =
507+ Check
508+ Zkapp_precondition.Closed_interval.
509+ { lower = Global_slot_since_genesis. zero
510+ ; upper =
511+ Global_slot_since_genesis. of_int
512+ ( Global_slot_since_hard_fork. to_int
513+ global_slot_since_hard_fork
514+ + 500000 - 5 )
515+ }
516+ }
517+ }
518+ in
519+
520+ section_hard " send a zkapp command that's expired after the fork"
521+ @@ send_invalid_zkapp ~logger
522+ (Network.Node. get_ingress_uri node_b)
523+ zkapp_txn_expired_before_fork " Expired"
524+ in
525+ let % bind () =
526+ let nonce = Mina_numbers.Account_nonce. succ sender_current_nonce in
527+ let valid_until = Mina_numbers.Global_slot_since_genesis. of_int 400000 in
528+ let memo_string = " " in
529+ let memo = Signed_command_memo. create_from_string_exn memo_string in
530+ let payload =
531+ let payment_payload =
532+ { Payment_payload.Poly. receiver_pk = receiver_pub_key; amount }
533+ in
534+ let body = Signed_command_payload.Body. Payment payment_payload in
535+ let common =
536+ { Signed_command_payload.Common.Poly. fee
537+ ; fee_payer_pk = sender_pub_key
538+ ; nonce
539+ ; valid_until
540+ ; memo
541+ }
542+ in
543+ { Signed_command_payload.Poly. common; body }
544+ in
545+ let raw_signature =
546+ Signed_command. sign_payload ~signature_kind sender.private_key payload
547+ |> Signature.Raw. encode
548+ in
549+ section_hard " send a payment that's expired before the fork"
550+ @@ send_invalid_payment ~logger ~sender_pub_key ~receiver_pub_key ~amount
551+ ~fee ~nonce ~memo: memo_string ~valid_until ~raw_signature
552+ ~expected_failure:
553+ Network_pool.Transaction_pool.Diff_versioned.Diff_error. (
554+ to_string_name Expired )
555+ (Network.Node. get_ingress_uri node_b)
556+ in
557+ let % bind () =
558+ let % bind global_slot_since_hard_fork =
559+ Integration_test_lib. Graphql_requests
560+ .must_get_global_slot_since_hard_fork ~logger
561+ (Network.Node. get_ingress_uri node_b)
562+ in
563+ let nonce = Mina_numbers.Account_nonce. succ sender_current_nonce in
564+ let valid_until =
565+ Mina_numbers.Global_slot_since_genesis. of_int
566+ ( Global_slot_since_hard_fork. to_int global_slot_since_hard_fork
567+ + 500000 - 5 )
568+ in
569+ let memo_string = " " in
570+ let memo = Signed_command_memo. create_from_string_exn memo_string in
571+ let payload =
572+ let payment_payload =
573+ { Payment_payload.Poly. receiver_pk = receiver_pub_key; amount }
574+ in
575+ let body = Signed_command_payload.Body. Payment payment_payload in
576+ let common =
577+ { Signed_command_payload.Common.Poly. fee
578+ ; fee_payer_pk = sender_pub_key
579+ ; nonce
580+ ; valid_until
581+ ; memo
582+ }
583+ in
584+ { Signed_command_payload.Poly. common; body }
585+ in
586+ let raw_signature =
587+ Signed_command. sign_payload ~signature_kind sender.private_key payload
588+ |> Signature.Raw. encode
589+ in
590+ section_hard " send a payment that's expired after the fork"
591+ @@ send_invalid_payment ~logger ~sender_pub_key ~receiver_pub_key ~amount
592+ ~fee ~nonce ~memo: memo_string ~valid_until ~raw_signature
593+ ~expected_failure:
594+ Network_pool.Transaction_pool.Diff_versioned.Diff_error. (
595+ to_string_name Expired )
596+ (Network.Node. get_ingress_uri node_b)
597+ in
455598 let % bind () =
456599 section_hard " send out txns to fill up the snark ledger"
457600 (let receiver = node_a in
0 commit comments