diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index e3ecc5ff833bd15a3be7f6b4196c2a091f0fb569..2175134b8691086bce21ffd3715aa157a8d37355 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -758,6 +758,8 @@ module Script : sig val unit_parameter : lazy_expr + val is_unit : expr -> bool + val strip_locations_cost : _ michelson_node -> Gas.cost val strip_annotations_cost : node -> Gas.cost diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 908409e22774e43a4150e3dcfc428cace68e1bea..030e52fc4654f0fa5c63dda05d46634fb2aed87b 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -991,69 +991,75 @@ let apply_manager_operation : ctxt parameters >>?= fun (parameters, ctxt) -> - (match (Entrypoint.to_string entrypoint, Micheline.root parameters) with - | "default", Prim (_, D_Unit, [], _) -> + let elab_conf = Script_ir_translator_config.make ~legacy:false () in + (match Entrypoint.to_string entrypoint with + | "default" -> + fail_unless + (Script.is_unit parameters) + (Script_interpreter.Bad_contract_parameter source_contract) + >>=? fun () -> apply_transaction_to_implicit ~ctxt ~sender:source_contract ~amount ~pkh ~before_operation:ctxt_before_op - | "stake", Prim (_, D_Unit, [], _) -> + | "stake" -> + fail_unless + (Script.is_unit parameters) + (Script_interpreter.Bad_contract_parameter source_contract) + >>=? fun () -> apply_stake ~ctxt ~sender:source ~amount ~destination:pkh ~before_operation:ctxt_before_op - | "unstake", Int (_, requested_amount) -> + | "unstake" -> + Script_ir_translator.parse_data + ~elab_conf + ctxt + ~allow_forged:false + Script_typed_ir.int_t + (Micheline.root parameters) + >>=? fun (requested_amount, ctxt) -> apply_unstake ~ctxt ~sender:source ~amount - ~requested_amount + ~requested_amount:(Script_int.to_zint requested_amount) ~destination:pkh ~before_operation:ctxt_before_op - | "finalize_unstake", Prim (_, D_Unit, [], _) -> + | "finalize_unstake" -> + fail_unless + (Script.is_unit parameters) + (Script_interpreter.Bad_contract_parameter source_contract) + >>=? fun () -> apply_finalize_unstake ~ctxt ~sender:source ~amount ~destination:pkh ~before_operation:ctxt_before_op - | ( "set_delegate_parameters", - Prim - ( _, - D_Pair, - [ - Int (_, staking_over_baking_limit_millionth); - Prim - ( _, - D_Pair, - [ - Int (_, baking_over_staking_edge_billionth); - Prim (_, D_Unit, [], []); - ], - [] ); - ], - [] ) ) -> + | "set_delegate_parameters" -> + Script_ir_translator.parse_data + ~elab_conf + ctxt + ~allow_forged:false + Script_typed_ir.pair_int_int_unit_t + (Micheline.root parameters) + >>=? fun ( ( staking_over_baking_limit_millionth, + (baking_over_staking_edge_billionth, ()) ), + ctxt ) -> apply_set_delegate_parameters ~ctxt ~sender:source ~destination:pkh - ~staking_over_baking_limit_millionth - ~baking_over_staking_edge_billionth + ~staking_over_baking_limit_millionth: + (Script_int.to_zint staking_over_baking_limit_millionth) + ~baking_over_staking_edge_billionth: + (Script_int.to_zint baking_over_staking_edge_billionth) ~before_operation:ctxt_before_op - | ( ( "default" | "stake" | "unstake" | "finalize_unstake" - | "set_delegate_parameters" ), - _ ) -> - (* Only allow: - - [unit] parameter to implicit accounts' default, stake, - and finalize_unstake entrypoints; - - [nat] parameter to implicit accounts' unstake entrypoint; - - [pair nat nat unit] parameter to implicit accounts' - set_delegate_parameters entrypoint.*) - tzfail (Script_interpreter.Bad_contract_parameter source_contract) | _ -> tzfail (Script_tc_errors.No_such_entrypoint entrypoint)) >|=? fun (ctxt, res, ops) -> (ctxt, Transaction_result res, ops) | Transaction diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index eacc421362bf37ce13ac59c7209f0596a8c79e8f..098caa4d2e27c6d5242512b845af0b112515cdb5 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -1949,6 +1949,12 @@ let comparable_pair_t loc l r = let comparable_pair_3_t loc l m r = comparable_pair_t loc m r >>? fun r -> comparable_pair_t loc l r +let pair_int_int_unit_t = + let iu_metadata = assert_ok2 pair_metadata int_metadata unit_metadata in + let iiu_metadata = assert_ok2 pair_metadata int_metadata iu_metadata in + Pair_t + (int_t, Pair_t (int_t, unit_t, iu_metadata, YesYes), iiu_metadata, YesYes) + let or_t : type a ac b bc. Script.location -> (a, ac) ty -> (b, bc) ty -> (a, b) or_ ty_ex_c tzresult = diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index 834641ddf2b5f57c7536ed35790ff280a0412e0e..b5889288a17b7b2b64df146c32406371aabbb2f2 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -1743,6 +1743,8 @@ val comparable_pair_3_t : 'c comparable_ty -> ('a, ('b, 'c) pair) pair comparable_ty tzresult +val pair_int_int_unit_t : (z num, (z num, unit) pair) pair comparable_ty + val or_t : Script.location -> ('a, _) ty -> ('b, _) ty -> ('a, 'b) or_ ty_ex_c tzresult