diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index f3ff86ed51f918ac895dd8dce57c166cba40d2fd..ba6b66f451d782bc8912f3a5038fc444b12427b7 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1429,16 +1429,12 @@ let apply_external_manager_operation_content : >>?= fun (unparsed_code, ctxt) -> let (Script {storage_type; views; storage; _}) = parsed_script in let views_result = - Script_ir_translator.typecheck_views - ctxt - ~legacy:false - storage_type - views + Script_ir_translator.parse_views ctxt ~legacy:false storage_type views in trace (Script_tc_errors.Ill_typed_contract (unparsed_code, [])) views_result - >>=? fun ctxt -> + >>=? fun (_typed_views, ctxt) -> apply_origination ~ctxt ~storage_type diff --git a/src/proto_alpha/lib_protocol/script_interpreter.ml b/src/proto_alpha/lib_protocol/script_interpreter.ml index 2eb11de5eb1e20497942ec4f79e557ffcf77d606..dbe35717b19c6d310c1cd9d7bb5497896ffb95b8 100644 --- a/src/proto_alpha/lib_protocol/script_interpreter.ml +++ b/src/proto_alpha/lib_protocol/script_interpreter.ml @@ -1063,7 +1063,7 @@ and step : type a s b t r f. (a, s, b, t, r, f) step_type = | None -> (return_none [@ocaml.tailcall]) ctxt | Some view -> ( let view_result = - Script_ir_translator.parse_view_returning + Script_ir_translator.parse_view ctxt ~legacy:true storage_type @@ -1074,68 +1074,61 @@ and step : type a s b t r f. (a, s, b, t, r, f) step_type = Script_tc_errors.Ill_typed_contract (Micheline.strip_locations view.view_code, [])) view_result - >>=? fun (Ex_view f, ctxt) -> - match f with - | Lam - ( { - kloc; - kaft = Item_t (aft_ty, Bot_t); - kbef = Item_t (bef_ty, Bot_t); - kinstr; - }, - _script_view ) -> ( - pair_t kloc input_ty storage_type - >>?= fun (Ty_ex_c pair_ty) -> - let io_ty = - let open Gas_monad.Syntax in - let* out_eq = - Script_ir_translator.ty_eq - ~error_details:Fast - kloc - aft_ty - output_ty - in - let+ in_eq = - ty_eq ~error_details:Fast kloc bef_ty pair_ty - in - (out_eq, in_eq) - in - Gas_monad.run ctxt io_ty >>?= fun (eq, ctxt) -> - match eq with - | Error Inconsistent_types_fast -> - (return_none [@ocaml.tailcall]) ctxt - | Ok (Eq, Eq) -> ( - let kkinfo = kinfo_of_kinstr k in - match kkinfo.kstack_ty with - | Item_t (_, s) -> - let kstack_ty = Item_t (output_ty, s) in - let kkinfo = {kkinfo with kstack_ty} in - let ks = KCons (ICons_some (kkinfo, k), ks) in - Contract.get_balance_carbonated ctxt c - >>=? fun (ctxt, balance) -> - let (gas, ctxt) = - local_gas_counter_and_outdated_context ctxt - in - (step [@ocaml.tailcall]) - ( ctxt, - { - source = sc.self; - self = c; - amount = Tez.zero; - balance; - (* The following remain unchanged, but let's - list them anyway, so that we don't forget - to update something added later. *) - payer = sc.payer; - chain_id = sc.chain_id; - now = sc.now; - level = sc.level; - } ) - gas - kinstr - (KView_exit (sc, KReturn (stack, ks))) - (input, storage) - (EmptyCell, EmptyCell)))))) + >>=? fun ( Typed_view + { + input_ty = input_ty'; + output_ty = output_ty'; + kinstr; + original_code_expr = _; + }, + ctxt ) -> + let loc = Micheline.location view.view_code in + let io_ty = + let open Gas_monad.Syntax in + let* out_eq = + ty_eq ~error_details:Fast loc output_ty' output_ty + in + let+ in_eq = + ty_eq ~error_details:Fast loc input_ty input_ty' + in + (out_eq, in_eq) + in + Gas_monad.run ctxt io_ty >>?= fun (eq, ctxt) -> + match eq with + | Error Inconsistent_types_fast -> + (return_none [@ocaml.tailcall]) ctxt + | Ok (Eq, Eq) -> ( + let kkinfo = kinfo_of_kinstr k in + match kkinfo.kstack_ty with + | Item_t (_, s) -> + let kstack_ty = Item_t (output_ty, s) in + let kkinfo = {kkinfo with kstack_ty} in + let ks = KCons (ICons_some (kkinfo, k), ks) in + Contract.get_balance_carbonated ctxt c + >>=? fun (ctxt, balance) -> + let (gas, ctxt) = + local_gas_counter_and_outdated_context ctxt + in + (step [@ocaml.tailcall]) + ( ctxt, + { + source = sc.self; + self = c; + amount = Tez.zero; + balance; + (* The following remain unchanged, but let's + list them anyway, so that we don't forget + to update something added later. *) + payer = sc.payer; + chain_id = sc.chain_id; + now = sc.now; + level = sc.level; + } ) + gas + kinstr + (KView_exit (sc, KReturn (stack, ks))) + (input, storage) + (EmptyCell, EmptyCell))))) | Tx_rollup _ -> (return_none [@ocaml.tailcall]) ctxt) | ICreate_contract {storage_type; code; k; kinfo = _} -> (* Removed the instruction's arguments manager, spendable and delegatable *) diff --git a/src/proto_alpha/lib_protocol/script_ir_translator.ml b/src/proto_alpha/lib_protocol/script_ir_translator.ml index ef520d06b763bee693db8fc2c48afcb86213da3e..1c99eb32003dde4bfe2c06e5d46da2c20fe767fc 100644 --- a/src/proto_alpha/lib_protocol/script_ir_translator.ml +++ b/src/proto_alpha/lib_protocol/script_ir_translator.ml @@ -1815,10 +1815,16 @@ type ex_script = Ex_script : ('a, 'c) Script_typed_ir.script -> ex_script type ex_code = Ex_code : ('a, 'c) code -> ex_code -type 'storage ex_view = - | Ex_view : - ('input * 'storage, 'output) Script_typed_ir.lambda - -> 'storage ex_view +type 'storage typed_view = + | Typed_view : { + input_ty : ('input, _) ty; + output_ty : ('output, _) ty; + kinstr : ('input * 'storage, end_of_stack, 'output, end_of_stack) kinstr; + original_code_expr : Script.node; + } + -> 'storage typed_view + +type 'storage typed_view_map = (Script_string.t, 'storage typed_view) map type (_, _) dig_proof_argument = | Dig_proof_argument : @@ -2952,14 +2958,14 @@ let[@coq_axiom_with_reason "gadt"] rec parse_data : | (Chest_t, expr) -> traced_fail (Invalid_kind (location expr, [Bytes_kind], kind expr)) -and parse_view_returning : +and parse_view : type storage storagec. ?type_logger:type_logger -> context -> legacy:bool -> (storage, storagec) ty -> view -> - (storage ex_view * context) tzresult Lwt.t = + (storage typed_view * context) tzresult Lwt.t = fun ?type_logger ctxt ~legacy storage_type {input_ty; output_ty; view_code} -> let input_ty_loc = location input_ty in record_trace_eval @@ -2967,15 +2973,15 @@ and parse_view_returning : Ill_formed_type (Some "arg of view", strip_locations input_ty, input_ty_loc)) (parse_view_input_ty ctxt ~stack_depth:0 ~legacy input_ty) - >>?= fun (Ex_ty input_ty', ctxt) -> + >>?= fun (Ex_ty input_ty, ctxt) -> let output_ty_loc = location output_ty in record_trace_eval (fun () -> Ill_formed_type (Some "return of view", strip_locations output_ty, output_ty_loc)) (parse_view_output_ty ctxt ~stack_depth:0 ~legacy output_ty) - >>?= fun (Ex_ty output_ty', ctxt) -> - pair_t input_ty_loc input_ty' storage_type >>?= fun (Ty_ex_c pair_ty) -> + >>?= fun (Ex_ty output_ty, ctxt) -> + pair_t input_ty_loc input_ty storage_type >>?= fun (Ty_ex_c pair_ty) -> parse_instr ?type_logger ~stack_depth:0 @@ -2989,15 +2995,15 @@ and parse_view_returning : @@ match judgement with | Failed {descr} -> - let cur_view' = - Ex_view - (Lam (close_descr (descr (Item_t (output_ty', Bot_t))), view_code)) - in - ok (cur_view', ctxt) + let {kinstr; _} = close_descr (descr (Item_t (output_ty, Bot_t))) in + ok + ( Typed_view + {input_ty; output_ty; kinstr; original_code_expr = view_code}, + ctxt ) | Typed ({loc; aft; _} as descr) -> ( let ill_type_view loc stack_ty () = let actual = serialize_stack_for_error ctxt stack_ty in - let expected_stack = Item_t (output_ty', Bot_t) in + let expected_stack = Item_t (output_ty, Bot_t) in let expected = serialize_stack_for_error ctxt expected_stack in Ill_typed_view {loc; actual; expected} in @@ -3007,25 +3013,31 @@ and parse_view_returning : @@ Gas_monad.record_trace_eval ~error_details:Informative (ill_type_view loc aft : unit -> _) - @@ ty_eq ~error_details:Informative loc ty output_ty' + @@ ty_eq ~error_details:Informative loc ty output_ty >>? fun (eq, ctxt) -> - eq >|? fun Eq -> (Ex_view (Lam (close_descr descr, view_code)), ctxt) + eq >|? fun Eq -> + let {kinstr; _} = close_descr descr in + ( Typed_view + {input_ty; output_ty; kinstr; original_code_expr = view_code}, + ctxt ) | _ -> error (ill_type_view loc aft ())) -and typecheck_views : +and parse_views : type storage storagec. ?type_logger:type_logger -> context -> legacy:bool -> (storage, storagec) ty -> view_map -> - context tzresult Lwt.t = + (storage typed_view_map * context) tzresult Lwt.t = fun ?type_logger ctxt ~legacy storage_type views -> - let aux _name cur_view ctxt = - parse_view_returning ?type_logger ctxt ~legacy storage_type cur_view - >|=? fun (_parsed_view, ctxt) -> ctxt + let aux ctxt name cur_view = + Gas.consume + ctxt + (Michelson_v1_gas.Cost_of.Interpreter.view_update name views) + >>?= fun ctxt -> parse_view ?type_logger ctxt ~legacy storage_type cur_view in - Script_map.fold_es aux views ctxt + Script_map.map_es_in_context aux ctxt views and[@coq_axiom_with_reason "gadt"] parse_returning : type arg argc ret retc. @@ -4633,10 +4645,10 @@ and[@coq_axiom_with_reason "gadt"] parse_instr : _ ), ctxt ) -> let views_result = - typecheck_views ctxt ?type_logger ~legacy storage_type views + parse_views ctxt ?type_logger ~legacy storage_type views in trace (Ill_typed_contract (canonical_code, [])) views_result - >>=? fun ctxt -> + >>=? fun (_typed_views, ctxt) -> (Gas_monad.run ctxt @@ let open Gas_monad.Syntax in @@ -5524,6 +5536,7 @@ type typechecked_code_internal = arg_type : ('arg, _) ty; storage_type : ('storage, _) ty; entrypoints : 'arg entrypoints; + typed_views : 'storage typed_view_map; type_map : type_map; } -> typechecked_code_internal @@ -5571,12 +5584,18 @@ let typecheck_code : code_field in trace (Ill_typed_contract (code, !type_map)) result >>=? fun (Lam _, ctxt) -> - let views_result = - typecheck_views ctxt ?type_logger ~legacy storage_type views - in - trace (Ill_typed_contract (code, !type_map)) views_result >|=? fun ctxt -> + let views_result = parse_views ctxt ?type_logger ~legacy storage_type views in + trace (Ill_typed_contract (code, !type_map)) views_result + >|=? fun (typed_views, ctxt) -> ( Typechecked_code_internal - {toplevel; arg_type; storage_type; entrypoints; type_map = !type_map}, + { + toplevel; + arg_type; + storage_type; + entrypoints; + typed_views; + type_map = !type_map; + }, ctxt ) (* Uncarbonated because used only in RPCs *) @@ -5914,6 +5933,7 @@ let parse_and_unparse_script_unaccounted ctxt ~legacy ~allow_forged_in_storage arg_type; storage_type; entrypoints; + typed_views; type_map = _; }, ctxt ) -> @@ -5927,47 +5947,62 @@ let parse_and_unparse_script_unaccounted ctxt ~legacy ~allow_forged_in_storage unparse_code ctxt ~stack_depth:0 mode code_field >>=? fun (code, ctxt) -> unparse_data ctxt ~stack_depth:0 mode storage_type storage >>=? fun (storage, ctxt) -> - Lwt.return - (let loc = Micheline.dummy_location in - (if normalize_types then - unparse_parameter_ty ~loc ctxt arg_type ~entrypoints - >>? fun (arg_type, ctxt) -> - unparse_ty ~loc ctxt storage_type >|? fun (storage_type, ctxt) -> - (arg_type, storage_type, ctxt) - else ok (original_arg_type_expr, original_storage_type_expr, ctxt)) - >|? fun (arg_type, storage_type, ctxt) -> - let open Micheline in - let unparse_view_unaccounted name {input_ty; output_ty; view_code} views = - Prim - ( loc, - K_view, - [ - String (loc, Script_string.to_string name); - input_ty; - output_ty; - view_code; - ], - [] ) - :: views - in - let views = - Script_map.fold unparse_view_unaccounted views [] |> List.rev - in - let code = - Seq - ( loc, - [ - Prim (loc, K_parameter, [arg_type], []); - Prim (loc, K_storage, [storage_type], []); - Prim (loc, K_code, [code], []); - ] - @ views ) - in - ( { - code = lazy_expr (strip_locations code); - storage = lazy_expr (strip_locations storage); - }, - ctxt )) + let loc = Micheline.dummy_location in + (if normalize_types then + unparse_parameter_ty ~loc ctxt arg_type ~entrypoints + >>?= fun (arg_type, ctxt) -> + unparse_ty ~loc ctxt storage_type >>?= fun (storage_type, ctxt) -> + Script_map.map_es_in_context + (fun ctxt + _name + (Typed_view {input_ty; output_ty; kinstr = _; original_code_expr}) -> + Lwt.return + ( unparse_ty ~loc ctxt input_ty >>? fun (input_ty, ctxt) -> + unparse_ty ~loc ctxt output_ty >|? fun (output_ty, ctxt) -> + ({input_ty; output_ty; view_code = original_code_expr}, ctxt) )) + ctxt + typed_views + >|=? fun (views, ctxt) -> (arg_type, storage_type, views, ctxt) + else return (original_arg_type_expr, original_storage_type_expr, views, ctxt)) + >>=? fun (arg_type, storage_type, views, ctxt) -> + Script_map.map_es_in_context + (fun ctxt _name {input_ty; output_ty; view_code} -> + unparse_code ctxt ~stack_depth:0 mode view_code + >|=? fun (view_code, ctxt) -> ({input_ty; output_ty; view_code}, ctxt)) + ctxt + views + >>=? fun (views, ctxt) -> + let open Micheline in + let unparse_view_unaccounted name {input_ty; output_ty; view_code} views = + Prim + ( loc, + K_view, + [ + String (loc, Script_string.to_string name); + input_ty; + output_ty; + view_code; + ], + [] ) + :: views + in + let views = Script_map.fold unparse_view_unaccounted views [] |> List.rev in + let code = + Seq + ( loc, + [ + Prim (loc, K_parameter, [arg_type], []); + Prim (loc, K_storage, [storage_type], []); + Prim (loc, K_code, [code], []); + ] + @ views ) + in + return + ( { + code = lazy_expr (strip_locations code); + storage = lazy_expr (strip_locations storage); + }, + ctxt ) let pack_data_with_mode ctxt ty data ~mode = unparse_data ~stack_depth:0 ctxt mode ty data >>=? fun (unparsed, ctxt) -> diff --git a/src/proto_alpha/lib_protocol/script_ir_translator.mli b/src/proto_alpha/lib_protocol/script_ir_translator.mli index a2504a6d7128d6a9982f07effd1aebbacd48f4ed..9ab18aeeaeece0140bb2be97e798f0d289ce0b34 100644 --- a/src/proto_alpha/lib_protocol/script_ir_translator.mli +++ b/src/proto_alpha/lib_protocol/script_ir_translator.mli @@ -114,10 +114,22 @@ type ('arg, 'storage) code = type ex_code = Ex_code : ('a, 'c) code -> ex_code -type 'storage ex_view = - | Ex_view : - ('input * 'storage, 'output) Script_typed_ir.lambda - -> 'storage ex_view +type 'storage typed_view = + | Typed_view : { + input_ty : ('input, _) Script_typed_ir.ty; + output_ty : ('output, _) Script_typed_ir.ty; + kinstr : + ( 'input * 'storage, + Script_typed_ir.end_of_stack, + 'output, + Script_typed_ir.end_of_stack ) + Script_typed_ir.kinstr; + original_code_expr : Script.node; + } + -> 'storage typed_view + +type 'storage typed_view_map = + (Script_string.t, 'storage typed_view) Script_typed_ir.map type ('a, 's, 'b, 'u) cinstr = { apply : @@ -293,21 +305,21 @@ val parse_view_output_ty : Script.node -> (ex_ty * context) tzresult -val parse_view_returning : +val parse_view : ?type_logger:type_logger -> context -> legacy:bool -> ('storage, _) Script_typed_ir.ty -> Script_typed_ir.view -> - ('storage ex_view * context) tzresult Lwt.t + ('storage typed_view * context) tzresult Lwt.t -val typecheck_views : +val parse_views : ?type_logger:type_logger -> context -> legacy:bool -> ('storage, _) Script_typed_ir.ty -> Script_typed_ir.view_map -> - context tzresult Lwt.t + ('storage typed_view_map * context) tzresult Lwt.t (** [parse_ty] allowing big_map values, operations, contract and tickets. diff --git a/src/proto_alpha/lib_protocol/script_map.ml b/src/proto_alpha/lib_protocol/script_map.ml index 6aaa7afedb7d8e8c544ede0dd55e448c33105443..1a9aa5018fcf42334ee4d714319467db291731b9 100644 --- a/src/proto_alpha/lib_protocol/script_map.ml +++ b/src/proto_alpha/lib_protocol/script_map.ml @@ -115,3 +115,31 @@ let fold_es : let size : type key value. (key, value) map -> Script_int.n Script_int.num = fun (Map_tag (module Box)) -> Script_int.(abs (of_int Box.size)) + +let map_es_in_context : + type context key value value'. + (context -> key -> value -> (value' * context) tzresult Lwt.t) -> + context -> + (key, value) map -> + ((key, value') map * context) tzresult Lwt.t = + fun f ctxt (Map_tag (module Box)) -> + Box.OPS.fold_es + (fun key value (map, ctxt) -> + f ctxt key value >|=? fun (value, ctxt) -> + (Box.OPS.add key value map, ctxt)) + Box.boxed + (Box.OPS.empty, ctxt) + >|=? fun (map, ctxt) -> + ( Map_tag + (module struct + type key = Box.key + + type value = value' + + module OPS = Box.OPS + + let boxed = map + + let size = Box.size + end), + ctxt ) diff --git a/src/proto_alpha/lib_protocol/script_map.mli b/src/proto_alpha/lib_protocol/script_map.mli index a889610a53631895281d7592e15c062f1f038e98..fcf6a0af245325980b50b8903d87c6aea8385ab2 100644 --- a/src/proto_alpha/lib_protocol/script_map.mli +++ b/src/proto_alpha/lib_protocol/script_map.mli @@ -54,3 +54,9 @@ val mem : 'key -> ('key, 'value) map -> bool val get : 'key -> ('key, 'value) map -> 'value option val size : ('a, 'b) map -> Script_int.n Script_int.num + +val map_es_in_context : + ('context -> 'key -> 'value1 -> ('value2 * 'context) tzresult Lwt.t) -> + 'context -> + ('key, 'value1) map -> + (('key, 'value2) map * 'context) tzresult Lwt.t diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--create_contract_with_view.tz].out b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--create_contract_with_view.tz].out index c5047af5fab79f4e4c0146f7cd3347e29721fd3f..b39adfae8536ca49925e0835bfaf1e028a210054 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--create_contract_with_view.tz].out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--create_contract_with_view.tz].out @@ -1,7 +1,7 @@ tests_alpha/test_contract.py::TestTypecheck::test_typecheck[opcodes/create_contract_with_view.tz] Well typed -Gas remaining: 1039990.616 units remaining +Gas remaining: 1039990.516 units remaining { parameter unit ; storage (option address) ; code { /* [ pair unit unit ] */ diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_rec.tz].out b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_rec.tz].out index d8a77bc835a620114b76e4f2a32d411fd19766d5..873938b3313565a87f88842e48ee6fe90e8ac2be 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_rec.tz].out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_rec.tz].out @@ -1,7 +1,7 @@ tests_alpha/test_contract.py::TestTypecheck::test_typecheck[opcodes/view_rec.tz] Well typed -Gas remaining: 1039988.536 units remaining +Gas remaining: 1039988.440 units remaining { parameter unit ; storage unit ; view "loop" diff --git a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_toplevel_lib.tz].out b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_toplevel_lib.tz].out index 7da661cfaa71a818b8ed1cd03959d6026e429ce1..cabc26a8e72d068f13fa1b8760589ffecdbfd1fc 100644 --- a/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_toplevel_lib.tz].out +++ b/tests_python/tests_alpha/_regtest_outputs/test_contract.TestTypecheck::test_typecheck[opcodes--view_toplevel_lib.tz].out @@ -1,7 +1,7 @@ tests_alpha/test_contract.py::TestTypecheck::test_typecheck[opcodes/view_toplevel_lib.tz] Well typed -Gas remaining: 1039947.763 units remaining +Gas remaining: 1039946.819 units remaining { parameter nat ; storage nat ; code { CAR diff --git a/tezt/_regressions/run_views.out b/tezt/_regressions/run_views.out index e5a184579103b6faa7395f6bba06f99524ad9139..0d14e2ae939a57efdfeaa9f8418f7021baa88fdc 100644 --- a/tezt/_regressions/run_views.out +++ b/tezt/_regressions/run_views.out @@ -14,7 +14,7 @@ view "calls_count" unit nat { CDR ; SIZE }; view "last_caller" unit (option address) { CDR ; IF_CONS { DIP { DROP } ; SOME } { NONE address } }; ' --init '{}' --burn-cap 1 Node is bootstrapped. -Estimated gas: 1426.629 units (will add 100 for safety) +Estimated gas: 1426.921 units (will add 100 for safety) Estimated storage: 409 bytes added (will add 20 for safety) Operation successfully injected in the node. Operation hash is 'oow4SAcGS9xTtTqPKayDoSUrkfkNQRoPKE1pN1JuviFG2YrF6GY' @@ -51,7 +51,7 @@ This sequence of operations was run: KT1LfQjDNgPpdwMHbhzyQcD8GTE2L4rwxxpN Storage size: 152 bytes Paid storage size diff: 152 bytes - Consumed gas: 1426.629 + Consumed gas: 1426.921 Balance updates: tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx ... -ꜩ0.038 storage fees ........................... +ꜩ0.038 @@ -146,7 +146,7 @@ Contract memorized as check_caller. ./tezos-client --mode mockup --base-dir '' --wait none transfer 1 from bootstrap1 to KT1RdnquZZf4Y4ZDJvaEuY4cbam3xor3CffU --burn-cap 1 --arg '"KT1LfQjDNgPpdwMHbhzyQcD8GTE2L4rwxxpN"' Node is bootstrapped. -Estimated gas: 4418.891 units (will add 100 for safety) +Estimated gas: 4418.531 units (will add 100 for safety) Estimated storage: no bytes added Operation successfully injected in the node. Operation hash is 'opKVxALX6z77kHy3Tft1d16KCmivKgyyVcVm9hXuauAs5Mx2FsS' @@ -172,7 +172,7 @@ This sequence of operations was run: This transaction was successfully applied Updated storage: None Storage size: 208 bytes - Consumed gas: 4419.689 + Consumed gas: 4419.329 Balance updates: tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx ... -ꜩ1 KT1RdnquZZf4Y4ZDJvaEuY4cbam3xor3CffU ... +ꜩ1 @@ -216,20 +216,20 @@ This sequence of operations was run: ./tezos-client --mode mockup --base-dir '' --wait none transfer 1 from bootstrap1 to KT1RdnquZZf4Y4ZDJvaEuY4cbam3xor3CffU --burn-cap 1 --arg '"KT1LfQjDNgPpdwMHbhzyQcD8GTE2L4rwxxpN"' Node is bootstrapped. -Estimated gas: 4422.148 units (will add 100 for safety) +Estimated gas: 4421.788 units (will add 100 for safety) Estimated storage: 27 bytes added (will add 20 for safety) Operation successfully injected in the node. -Operation hash is 'onu8BqYeBJKc2KGG4UxNC7NAt1HDXj7FixJThwTVL3HZeGRkuhg' +Operation hash is 'onfWynbTF2Mhv5YXKRge4vS8dqsm8X75Q6ogUBLw4iVYDgAuvBx' NOT waiting for the operation to be included. Use command - tezos-client wait for onu8BqYeBJKc2KGG4UxNC7NAt1HDXj7FixJThwTVL3HZeGRkuhg to be included --confirmations 1 --branch BLockGenesisGenesisGenesisGenesisGenesisCCCCCeZiLHU + tezos-client wait for onfWynbTF2Mhv5YXKRge4vS8dqsm8X75Q6ogUBLw4iVYDgAuvBx to be included --confirmations 1 --branch BLockGenesisGenesisGenesisGenesisGenesisCCCCCeZiLHU and/or an external block explorer to make sure that it has been included. This sequence of operations was run: Manager signed operations: From: tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx Fee to the baker: ꜩ0.000749 Expected counter: 5 - Gas limit: 4523 + Gas limit: 4522 Storage limit: 47 bytes Balance updates: tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx ... -ꜩ0.000749 @@ -243,7 +243,7 @@ This sequence of operations was run: Updated storage: (Some 0x000002298c03ed7d454a101eb7022bc95f7e5f41ac78) Storage size: 235 bytes Paid storage size diff: 27 bytes - Consumed gas: 4422.946 + Consumed gas: 4422.586 Balance updates: tz1KqTpEZ7Yob7QbPE4Hy4Wo8fHG8LhKxZSx ... -ꜩ0.00675 storage fees ........................... +ꜩ0.00675