@@ -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,55 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
357354 in
358355 (vk_proof, vk_impossible)
359356 in
357+ let % bind zkapp_command_upgrade_version =
358+ let constraint_constants = Network. constraint_constants network in
359+ let snapp_update =
360+ { Account_update.Update. dummy with
361+ permissions = Zkapp_basic.Set_or_keep. Set Permissions. user_default
362+ }
363+ in
364+ let fee = Currency.Fee. of_nanomina_int_exn 1_000_000 in
365+ let amount = Currency.Amount. of_mina_int_exn 10 in
366+ let memo = Signed_command_memo. create_from_string_exn " update vk proof" in
367+ let (spec : Transaction_snark.For_tests.Update_states_spec.t ) =
368+ { sender = (vk_proof.keypair, Account.Nonce. zero)
369+ ; fee
370+ ; fee_payer = None
371+ ; receivers = []
372+ ; amount
373+ ; zkapp_account_keypairs = [ vk_proof.keypair ]
374+ ; memo
375+ ; new_zkapp_account = false
376+ ; snapp_update
377+ ; current_auth = Signature
378+ ; call_data = Snark_params.Tick.Field. zero
379+ ; events = []
380+ ; actions = []
381+ ; preconditions = None
382+ }
383+ in
384+ Malleable_error. lift
385+ @@ Transaction_snark.For_tests. update_states ~constraint_constants spec
386+ in
387+ let (zkapp_command_spec
388+ : Transaction_snark.For_tests.Multiple_transfers_spec. t ) =
389+ let amount = Currency.Amount. of_mina_int_exn 1 in
390+ let memo = Signed_command_memo. empty in
391+ { sender = (zkapp_account_keypair, Account.Nonce. zero)
392+ ; fee = Currency.Fee. of_nanomina_int_exn 1_000_000
393+ ; fee_payer = None
394+ ; receivers = [ (receiver_pub_key, amount) ]
395+ ; amount
396+ ; zkapp_account_keypairs = []
397+ ; memo
398+ ; new_zkapp_account = false
399+ ; snapp_update = Account_update.Update. dummy
400+ ; call_data = Snark_params.Tick.Field. zero
401+ ; events = []
402+ ; actions = []
403+ ; preconditions = None
404+ }
405+ in
360406 let wait_for_zkapp zkapp_command =
361407 let with_timeout =
362408 let soft_slots = 4 in
@@ -452,6 +498,137 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
452498 frontier"
453499 (wait_for_zkapp zkapp_command_create_accounts)
454500 in
501+ let % bind () =
502+ let zkapp_txn_expired_before_fork =
503+ Transaction_snark.For_tests. multiple_transfers ~constraint_constants
504+ { zkapp_command_spec with
505+ preconditions =
506+ Some
507+ { network =
508+ { Zkapp_precondition.Protocol_state. accept with
509+ global_slot_since_genesis =
510+ Check
511+ { upper = Global_slot_since_genesis. of_int 400000
512+ ; lower = Global_slot_since_genesis. zero
513+ }
514+ }
515+ ; account = Zkapp_precondition.Account. accept
516+ ; valid_while = Ignore
517+ }
518+ }
519+ in
520+ section_hard " send a zkapp command that's expired before 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 % bind global_slot_since_hard_fork =
527+ Integration_test_lib. Graphql_requests
528+ .must_get_global_slot_since_hard_fork ~logger
529+ (Network.Node. get_ingress_uri node_b)
530+ in
531+ let zkapp_txn_expired_before_fork =
532+ Transaction_snark.For_tests. multiple_transfers ~constraint_constants
533+ { zkapp_command_spec with
534+ preconditions =
535+ Some
536+ { network =
537+ { Zkapp_precondition.Protocol_state. accept with
538+ global_slot_since_genesis =
539+ Check
540+ { upper =
541+ Global_slot_since_genesis. of_int
542+ ( Global_slot_since_hard_fork. to_int
543+ global_slot_since_hard_fork
544+ + 500000 - 5 )
545+ ; lower = Global_slot_since_genesis. zero
546+ }
547+ }
548+ ; account = Zkapp_precondition.Account. accept
549+ ; valid_while = Ignore
550+ }
551+ }
552+ in
553+
554+ section_hard " send a zkapp command that's expired after the fork"
555+ @@ send_invalid_zkapp ~logger
556+ (Network.Node. get_ingress_uri node_b)
557+ zkapp_txn_expired_before_fork " Expired"
558+ in
559+ let % bind () =
560+ let nonce = Mina_numbers.Account_nonce. succ sender_current_nonce in
561+ let valid_until = Mina_numbers.Global_slot_since_genesis. of_int 400000 in
562+ let memo_string = " " in
563+ let memo = Signed_command_memo. create_from_string_exn memo_string in
564+ let payload =
565+ let payment_payload =
566+ { Payment_payload.Poly. receiver_pk = receiver_pub_key; amount }
567+ in
568+ let body = Signed_command_payload.Body. Payment payment_payload in
569+ let common =
570+ { Signed_command_payload.Common.Poly. fee
571+ ; fee_payer_pk = sender_pub_key
572+ ; nonce
573+ ; valid_until
574+ ; memo
575+ }
576+ in
577+ { Signed_command_payload.Poly. common; body }
578+ in
579+ let raw_signature =
580+ Signed_command. sign_payload ~signature_kind sender.private_key payload
581+ |> Signature.Raw. encode
582+ in
583+ section_hard " send a payment that's expired before the fork"
584+ @@ send_invalid_payment ~logger ~sender_pub_key ~receiver_pub_key ~amount
585+ ~fee ~nonce ~memo: memo_string ~valid_until ~raw_signature
586+ ~expected_failure:
587+ Network_pool.Transaction_pool.Diff_versioned.Diff_error. (
588+ to_string_name Expired )
589+ (Network.Node. get_ingress_uri node_b)
590+ in
591+ let % bind () =
592+ let % bind global_slot_since_hard_fork =
593+ Integration_test_lib. Graphql_requests
594+ .must_get_global_slot_since_hard_fork ~logger
595+ (Network.Node. get_ingress_uri node_b)
596+ in
597+ let nonce = Mina_numbers.Account_nonce. succ sender_current_nonce in
598+ let valid_until =
599+ Mina_numbers.Global_slot_since_genesis. of_int
600+ ( Global_slot_since_hard_fork. to_int global_slot_since_hard_fork
601+ + 500000 - 5 )
602+ in
603+ let memo_string = " " in
604+ let memo = Signed_command_memo. create_from_string_exn memo_string in
605+ let payload =
606+ let payment_payload =
607+ { Payment_payload.Poly. receiver_pk = receiver_pub_key; amount }
608+ in
609+ let body = Signed_command_payload.Body. Payment payment_payload in
610+ let common =
611+ { Signed_command_payload.Common.Poly. fee
612+ ; fee_payer_pk = sender_pub_key
613+ ; nonce
614+ ; valid_until
615+ ; memo
616+ }
617+ in
618+ { Signed_command_payload.Poly. common; body }
619+ in
620+ let raw_signature =
621+ Signed_command. sign_payload ~signature_kind sender.private_key payload
622+ |> Signature.Raw. encode
623+ in
624+ section_hard " send a payment that's expired after the fork"
625+ @@ send_invalid_payment ~logger ~sender_pub_key ~receiver_pub_key ~amount
626+ ~fee ~nonce ~memo: memo_string ~valid_until ~raw_signature
627+ ~expected_failure:
628+ Network_pool.Transaction_pool.Diff_versioned.Diff_error. (
629+ to_string_name Expired )
630+ (Network.Node. get_ingress_uri node_b)
631+ in
455632 let % bind () =
456633 section_hard " send out txns to fill up the snark ledger"
457634 (let receiver = node_a in
@@ -587,6 +764,19 @@ module Make (Inputs : Intf.Test.Inputs_intf) = struct
587764 transition frontier"
588765 @@ wait_for_zkapp zkapp_command_update_vk_impossible
589766 in
767+ let % bind () =
768+ section_hard
769+ " send a zkapp to upgrade permission's version to current version"
770+ @@ send_zkapp ~logger
771+ (Network.Node. get_ingress_uri node_a)
772+ zkapp_command_upgrade_version
773+ in
774+ let % bind () =
775+ section_hard
776+ " Wait for zkapp to upgrade perimission's version to be included in \
777+ transition frontier"
778+ @@ wait_for_zkapp zkapp_command_upgrade_version
779+ in
590780 section_hard " running replayer"
591781 (let % bind logs =
592782 Network.Node. run_replayer
0 commit comments