add predecessor timestamp to the CLI
This commit is contained in:
parent
e8c8aa4d2b
commit
2086dd9ab5
@ -66,7 +66,7 @@ let amount =
|
|||||||
let open Arg in
|
let open Arg in
|
||||||
let info =
|
let info =
|
||||||
let docv = "AMOUNT" in
|
let docv = "AMOUNT" in
|
||||||
let doc = "$(docv) is the amount the dry-run transaction will use." in
|
let doc = "$(docv) is the amount the michelson interpreter will use." in
|
||||||
info ~docv ~doc ["amount"] in
|
info ~docv ~doc ["amount"] in
|
||||||
value @@ opt string "0" info
|
value @@ opt string "0" info
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ let sender =
|
|||||||
let open Arg in
|
let open Arg in
|
||||||
let info =
|
let info =
|
||||||
let docv = "SENDER" in
|
let docv = "SENDER" in
|
||||||
let doc = "$(docv) is the sender the dry-run transaction will use." in
|
let doc = "$(docv) is the sender the michelson interpreter transaction will use." in
|
||||||
info ~docv ~doc ["sender"] in
|
info ~docv ~doc ["sender"] in
|
||||||
value @@ opt (some string) None info
|
value @@ opt (some string) None info
|
||||||
|
|
||||||
@ -82,10 +82,18 @@ let source =
|
|||||||
let open Arg in
|
let open Arg in
|
||||||
let info =
|
let info =
|
||||||
let docv = "SOURCE" in
|
let docv = "SOURCE" in
|
||||||
let doc = "$(docv) is the source the dry-run transaction will use." in
|
let doc = "$(docv) is the source the michelson interpreter transaction will use." in
|
||||||
info ~docv ~doc ["source"] in
|
info ~docv ~doc ["source"] in
|
||||||
value @@ opt (some string) None info
|
value @@ opt (some string) None info
|
||||||
|
|
||||||
|
let predecessor_timestamp =
|
||||||
|
let open Arg in
|
||||||
|
let info =
|
||||||
|
let docv = "PREDECESSOR_TIMESTAMP" in
|
||||||
|
let doc = "$(docv) is the pedecessor_timestamp the michelson interpreter transaction will use (e.g. '2000-01-01T10:10:10Z')" in
|
||||||
|
info ~docv ~doc ["predecessor-timestamp"] in
|
||||||
|
value @@ opt (some string) None info
|
||||||
|
|
||||||
let display_format =
|
let display_format =
|
||||||
let open Arg in
|
let open Arg in
|
||||||
let info =
|
let info =
|
||||||
@ -176,7 +184,7 @@ let compile_parameter =
|
|||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
|
|
||||||
let interpret =
|
let interpret =
|
||||||
let f expression init_file syntax amount sender source display_format =
|
let f expression init_file syntax amount sender source predecessor_timestamp display_format =
|
||||||
toplevel ~display_format @@
|
toplevel ~display_format @@
|
||||||
let%bind (decl_list,state,env) = match init_file with
|
let%bind (decl_list,state,env) = match init_file with
|
||||||
| Some init_file ->
|
| Some init_file ->
|
||||||
@ -192,13 +200,13 @@ let interpret =
|
|||||||
let%bind (typed_exp,_) = Compile.Of_simplified.compile_expression ~env ~state simplified_exp in
|
let%bind (typed_exp,_) = Compile.Of_simplified.compile_expression ~env ~state simplified_exp in
|
||||||
let%bind mini_c_exp = Compile.Of_typed.compile_expression typed_exp in
|
let%bind mini_c_exp = Compile.Of_typed.compile_expression typed_exp in
|
||||||
let%bind compiled_exp = Compile.Of_mini_c.aggregate_and_compile_expression decl_list mini_c_exp in
|
let%bind compiled_exp = Compile.Of_mini_c.aggregate_and_compile_expression decl_list mini_c_exp in
|
||||||
let%bind options = Run.make_dry_run_options {amount ; sender ; source } in
|
let%bind options = Run.make_dry_run_options {predecessor_timestamp ; amount ; sender ; source } in
|
||||||
let%bind value = Run.run ~options compiled_exp.expr compiled_exp.expr_ty in
|
let%bind value = Run.run ~options compiled_exp.expr compiled_exp.expr_ty in
|
||||||
let%bind simplified_output = Uncompile.uncompile_expression typed_exp.type_annotation value in
|
let%bind simplified_output = Uncompile.uncompile_expression typed_exp.type_annotation value in
|
||||||
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
||||||
in
|
in
|
||||||
let term =
|
let term =
|
||||||
Term.(const f $ expression "EXPRESSION" 0 $ init_file $ syntax $ amount $ sender $ source $ display_format ) in
|
Term.(const f $ expression "EXPRESSION" 0 $ init_file $ syntax $ amount $ sender $ source $ predecessor_timestamp $ display_format ) in
|
||||||
let cmdname = "interpret" in
|
let cmdname = "interpret" in
|
||||||
let doc = "Subcommand: interpret the expression in the context initialized by the provided source file." in
|
let doc = "Subcommand: interpret the expression in the context initialized by the provided source file." in
|
||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
@ -233,7 +241,7 @@ let compile_storage =
|
|||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
|
|
||||||
let dry_run =
|
let dry_run =
|
||||||
let f source_file entry_point storage input amount sender source syntax display_format =
|
let f source_file entry_point storage input amount sender source predecessor_timestamp syntax display_format =
|
||||||
toplevel ~display_format @@
|
toplevel ~display_format @@
|
||||||
let%bind simplified = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
let%bind simplified = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
||||||
let%bind typed_prg,state = Compile.Of_simplified.compile simplified in
|
let%bind typed_prg,state = Compile.Of_simplified.compile simplified in
|
||||||
@ -251,20 +259,20 @@ let dry_run =
|
|||||||
let%bind compiled_params = Compile.Of_mini_c.compile_expression mini_c in
|
let%bind compiled_params = Compile.Of_mini_c.compile_expression mini_c in
|
||||||
let%bind args_michelson = Run.evaluate_expression compiled_params.expr compiled_params.expr_ty in
|
let%bind args_michelson = Run.evaluate_expression compiled_params.expr compiled_params.expr_ty in
|
||||||
|
|
||||||
let%bind options = Run.make_dry_run_options {amount ; sender ; source } in
|
let%bind options = Run.make_dry_run_options {predecessor_timestamp ; amount ; sender ; source } in
|
||||||
let%bind michelson_output = Run.run_contract ~options michelson_prg.expr michelson_prg.expr_ty args_michelson in
|
let%bind michelson_output = Run.run_contract ~options michelson_prg.expr michelson_prg.expr_ty args_michelson in
|
||||||
|
|
||||||
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_function_result typed_prg entry_point michelson_output in
|
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_function_result typed_prg entry_point michelson_output in
|
||||||
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
||||||
in
|
in
|
||||||
let term =
|
let term =
|
||||||
Term.(const f $ source_file 0 $ entry_point 1 $ expression "PARAMETER" 2 $ expression "STORAGE" 3 $ amount $ sender $ source $ syntax $ display_format) in
|
Term.(const f $ source_file 0 $ entry_point 1 $ expression "PARAMETER" 2 $ expression "STORAGE" 3 $ amount $ sender $ source $ predecessor_timestamp $ syntax $ display_format) in
|
||||||
let cmdname = "dry-run" in
|
let cmdname = "dry-run" in
|
||||||
let doc = "Subcommand: run a smart-contract with the given storage and input." in
|
let doc = "Subcommand: run a smart-contract with the given storage and input." in
|
||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
|
|
||||||
let run_function =
|
let run_function =
|
||||||
let f source_file entry_point parameter amount sender source syntax display_format =
|
let f source_file entry_point parameter amount sender source predecessor_timestamp syntax display_format =
|
||||||
toplevel ~display_format @@
|
toplevel ~display_format @@
|
||||||
let%bind v_syntax = Helpers.syntax_to_variant (Syntax_name syntax) (Some source_file) in
|
let%bind v_syntax = Helpers.syntax_to_variant (Syntax_name syntax) (Some source_file) in
|
||||||
let%bind simplified_prg = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
let%bind simplified_prg = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
||||||
@ -278,32 +286,32 @@ let run_function =
|
|||||||
let%bind compiled_applied = Compile.Of_typed.compile_expression typed_app in
|
let%bind compiled_applied = Compile.Of_typed.compile_expression typed_app in
|
||||||
|
|
||||||
let%bind michelson = Compile.Of_mini_c.aggregate_and_compile_expression mini_c_prg compiled_applied in
|
let%bind michelson = Compile.Of_mini_c.aggregate_and_compile_expression mini_c_prg compiled_applied in
|
||||||
let%bind options = Run.make_dry_run_options {amount ; sender ; source } in
|
let%bind options = Run.make_dry_run_options {predecessor_timestamp ; amount ; sender ; source } in
|
||||||
let%bind michelson_output = Run.run ~options michelson.expr michelson.expr_ty in
|
let%bind michelson_output = Run.run ~options michelson.expr michelson.expr_ty in
|
||||||
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_function_result typed_prg entry_point michelson_output in
|
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_function_result typed_prg entry_point michelson_output in
|
||||||
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
||||||
in
|
in
|
||||||
let term =
|
let term =
|
||||||
Term.(const f $ source_file 0 $ entry_point 1 $ expression "PARAMETER" 2 $ amount $ sender $ source $ syntax $ display_format) in
|
Term.(const f $ source_file 0 $ entry_point 1 $ expression "PARAMETER" 2 $ amount $ sender $ source $ predecessor_timestamp $ syntax $ display_format) in
|
||||||
let cmdname = "run-function" in
|
let cmdname = "run-function" in
|
||||||
let doc = "Subcommand: run a function with the given parameter." in
|
let doc = "Subcommand: run a function with the given parameter." in
|
||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
|
|
||||||
let evaluate_value =
|
let evaluate_value =
|
||||||
let f source_file entry_point amount sender source syntax display_format =
|
let f source_file entry_point amount sender source predecessor_timestamp syntax display_format =
|
||||||
toplevel ~display_format @@
|
toplevel ~display_format @@
|
||||||
let%bind simplified = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
let%bind simplified = Compile.Of_source.compile source_file (Syntax_name syntax) in
|
||||||
let%bind typed_prg,_ = Compile.Of_simplified.compile simplified in
|
let%bind typed_prg,_ = Compile.Of_simplified.compile simplified in
|
||||||
let%bind mini_c = Compile.Of_typed.compile typed_prg in
|
let%bind mini_c = Compile.Of_typed.compile typed_prg in
|
||||||
let%bind (exp,_) = Mini_c.get_entry mini_c entry_point in
|
let%bind (exp,_) = Mini_c.get_entry mini_c entry_point in
|
||||||
let%bind compiled = Compile.Of_mini_c.aggregate_and_compile_expression mini_c exp in
|
let%bind compiled = Compile.Of_mini_c.aggregate_and_compile_expression mini_c exp in
|
||||||
let%bind options = Run.make_dry_run_options {amount ; sender ; source } in
|
let%bind options = Run.make_dry_run_options {predecessor_timestamp ; amount ; sender ; source } in
|
||||||
let%bind michelson_output = Run.run ~options compiled.expr compiled.expr_ty in
|
let%bind michelson_output = Run.run ~options compiled.expr compiled.expr_ty in
|
||||||
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_expression_result typed_prg entry_point michelson_output in
|
let%bind simplified_output = Uncompile.uncompile_typed_program_entry_expression_result typed_prg entry_point michelson_output in
|
||||||
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
ok @@ Format.asprintf "%a\n" Ast_simplified.PP.expression simplified_output
|
||||||
in
|
in
|
||||||
let term =
|
let term =
|
||||||
Term.(const f $ source_file 0 $ entry_point 1 $ amount $ sender $ source $ syntax $ display_format) in
|
Term.(const f $ source_file 0 $ entry_point 1 $ amount $ sender $ source $ predecessor_timestamp $ syntax $ display_format) in
|
||||||
let cmdname = "evaluate-value" in
|
let cmdname = "evaluate-value" in
|
||||||
let doc = "Subcommand: evaluate a given definition." in
|
let doc = "Subcommand: evaluate a given definition." in
|
||||||
(Term.ret term , Term.info ~doc cmdname)
|
(Term.ret term , Term.info ~doc cmdname)
|
||||||
|
@ -16,6 +16,7 @@ type run_failwith_res =
|
|||||||
|
|
||||||
type dry_run_options =
|
type dry_run_options =
|
||||||
{ amount : string ;
|
{ amount : string ;
|
||||||
|
predecessor_timestamp : string option ;
|
||||||
sender : string option ;
|
sender : string option ;
|
||||||
source : string option }
|
source : string option }
|
||||||
|
|
||||||
@ -44,7 +45,14 @@ let make_dry_run_options (opts : dry_run_options) : options result =
|
|||||||
(simple_error "invalid source address")
|
(simple_error "invalid source address")
|
||||||
(Contract.of_b58check source) in
|
(Contract.of_b58check source) in
|
||||||
ok (Some source) in
|
ok (Some source) in
|
||||||
ok @@ make_options ~amount ?source:sender ?payer:source ()
|
let%bind predecessor_timestamp =
|
||||||
|
match opts.predecessor_timestamp with
|
||||||
|
| None -> ok None
|
||||||
|
| Some st ->
|
||||||
|
match Memory_proto_alpha.Protocol.Alpha_context.Timestamp.of_notation st with
|
||||||
|
| Some t -> ok (Some t)
|
||||||
|
| None -> simple_fail "bad timestamp notation" in
|
||||||
|
ok @@ make_options ?predecessor_timestamp:predecessor_timestamp ~amount ?source:sender ?payer:source ()
|
||||||
|
|
||||||
let ex_value_ty_to_michelson (v : ex_typed_value) : Michelson.t result =
|
let ex_value_ty_to_michelson (v : ex_typed_value) : Michelson.t result =
|
||||||
let (Ex_typed_value (value , ty)) = v in
|
let (Ex_typed_value (value , ty)) = v in
|
||||||
|
@ -43,26 +43,22 @@ let storage st = e_timestamp (Int64.to_int @@ to_sec st)
|
|||||||
|
|
||||||
let early_call () =
|
let early_call () =
|
||||||
let%bind program,_ = get_program () in
|
let%bind program,_ = get_program () in
|
||||||
let%bind now = mk_time "2000-01-01T00:10:10Z" in
|
let%bind predecessor_timestamp = mk_time "2000-01-01T00:10:10Z" in
|
||||||
let%bind lock_time = mk_time "2000-01-01T10:10:10Z" in
|
let%bind lock_time = mk_time "2000-01-01T10:10:10Z" in
|
||||||
let init_storage = storage lock_time in
|
let init_storage = storage lock_time in
|
||||||
let options =
|
let options =
|
||||||
let tezos_context = { Proto_alpha_utils.Memory_proto_alpha.dummy_environment.tezos_context with
|
Proto_alpha_utils.Memory_proto_alpha.make_options ~predecessor_timestamp () in
|
||||||
predecessor_timestamp = now ; } in
|
|
||||||
Proto_alpha_utils.Memory_proto_alpha.make_options ~tezos_context () in
|
|
||||||
let exp_failwith = "Contract is still time locked" in
|
let exp_failwith = "Contract is still time locked" in
|
||||||
expect_string_failwith ~options program "main"
|
expect_string_failwith ~options program "main"
|
||||||
(e_pair (call empty_message) init_storage) exp_failwith
|
(e_pair (call empty_message) init_storage) exp_failwith
|
||||||
|
|
||||||
let call_on_time () =
|
let call_on_time () =
|
||||||
let%bind program,_ = get_program () in
|
let%bind program,_ = get_program () in
|
||||||
let%bind now = mk_time "2000-01-01T10:10:10Z" in
|
let%bind predecessor_timestamp = mk_time "2000-01-01T10:10:10Z" in
|
||||||
let%bind lock_time = mk_time "2000-01-01T00:10:10Z" in
|
let%bind lock_time = mk_time "2000-01-01T00:10:10Z" in
|
||||||
let init_storage = storage lock_time in
|
let init_storage = storage lock_time in
|
||||||
let options =
|
let options =
|
||||||
let tezos_context = { Proto_alpha_utils.Memory_proto_alpha.dummy_environment.tezos_context with
|
Proto_alpha_utils.Memory_proto_alpha.make_options ~predecessor_timestamp () in
|
||||||
predecessor_timestamp = now ; } in
|
|
||||||
Proto_alpha_utils.Memory_proto_alpha.make_options ~tezos_context () in
|
|
||||||
expect_eq ~options program "main"
|
expect_eq ~options program "main"
|
||||||
(e_pair (call empty_message) init_storage) (e_pair empty_op_list init_storage)
|
(e_pair (call empty_message) init_storage) (e_pair empty_op_list init_storage)
|
||||||
|
|
||||||
|
@ -1066,13 +1066,16 @@ type options = {
|
|||||||
|
|
||||||
let make_options
|
let make_options
|
||||||
?(tezos_context = dummy_environment.tezos_context)
|
?(tezos_context = dummy_environment.tezos_context)
|
||||||
|
?(predecessor_timestamp = dummy_environment.tezos_context.predecessor_timestamp)
|
||||||
?(source = (List.nth dummy_environment.identities 0).implicit_contract)
|
?(source = (List.nth dummy_environment.identities 0).implicit_contract)
|
||||||
?(self = (List.nth dummy_environment.identities 0).implicit_contract)
|
?(self = (List.nth dummy_environment.identities 0).implicit_contract)
|
||||||
?(payer = (List.nth dummy_environment.identities 1).implicit_contract)
|
?(payer = (List.nth dummy_environment.identities 1).implicit_contract)
|
||||||
?(amount = Alpha_context.Tez.one)
|
?(amount = Alpha_context.Tez.one)
|
||||||
?(chain_id = Environment.Chain_id.zero)
|
?(chain_id = Environment.Chain_id.zero)
|
||||||
()
|
()
|
||||||
= {
|
=
|
||||||
|
let tezos_context = { tezos_context with predecessor_timestamp } in
|
||||||
|
{
|
||||||
tezos_context ;
|
tezos_context ;
|
||||||
source ;
|
source ;
|
||||||
self ;
|
self ;
|
||||||
|
Loading…
Reference in New Issue
Block a user