diff --git a/src/proto_alpha/lib_client/injection.ml b/src/proto_alpha/lib_client/injection.ml index 178052c418bc4196ffa550a9996d52a6506f4fbb..397740a8ad71dc2b9307a2a810ac4ed239477ff4 100644 --- a/src/proto_alpha/lib_client/injection.ml +++ b/src/proto_alpha/lib_client/injection.ml @@ -305,9 +305,10 @@ let estimated_gas_single (type kind) match result with | Applied res | Backtracked (res, _) -> ( match res with - | Transaction_result (Transaction_to_contract_result {consumed_gas; _}) - | Transaction_result (Transaction_to_tx_rollup_result {consumed_gas; _}) - -> + | Transaction_result + ( Transaction_to_contract_result {consumed_gas; _} + | Transaction_to_tx_rollup_result {consumed_gas; _} + | Transaction_to_sc_rollup_result {consumed_gas; _} ) -> Ok consumed_gas | Origination_result {consumed_gas; _} -> Ok consumed_gas | Reveal_result {consumed_gas} -> Ok consumed_gas @@ -344,9 +345,10 @@ let estimated_gas_single (type kind) match result with | Applied res | Backtracked (res, _) -> ( match res with - | ITransaction_result (Transaction_to_contract_result {consumed_gas; _}) | ITransaction_result - (Transaction_to_tx_rollup_result {consumed_gas; _}) -> + ( Transaction_to_contract_result {consumed_gas; _} + | Transaction_to_tx_rollup_result {consumed_gas; _} + | Transaction_to_sc_rollup_result {consumed_gas; _} ) -> Ok consumed_gas | IOrigination_result {consumed_gas; _} -> Ok consumed_gas | IDelegation_result {consumed_gas} -> Ok consumed_gas) @@ -381,6 +383,7 @@ let estimated_storage_single (type kind) ~tx_rollup_origination_size We need to charge for newly allocated storage (as we do for Michelson’s big map). *) Ok Z.zero + | Transaction_result (Transaction_to_sc_rollup_result _) -> Ok Z.zero | Origination_result {paid_storage_size_diff; _} -> Ok (Z.add paid_storage_size_diff origination_size) | Reveal_result _ -> Ok Z.zero @@ -436,6 +439,7 @@ let estimated_storage_single (type kind) ~tx_rollup_origination_size We need to charge for newly allocated storage (as we do for Michelson’s big map). *) Ok Z.zero + | ITransaction_result (Transaction_to_sc_rollup_result _) -> Ok Z.zero | IOrigination_result {paid_storage_size_diff; _} -> Ok (Z.add paid_storage_size_diff origination_size) | IDelegation_result _ -> Ok Z.zero) @@ -480,7 +484,10 @@ let originated_contracts_single (type kind) | Transaction_result (Transaction_to_contract_result {originated_contracts; _}) -> Ok originated_contracts - | Transaction_result (Transaction_to_tx_rollup_result _) -> Ok [] + | Transaction_result + ( Transaction_to_tx_rollup_result _ + | Transaction_to_sc_rollup_result _ ) -> + Ok [] | Origination_result {originated_contracts; _} -> Ok originated_contracts | Register_global_constant_result _ -> Ok [] @@ -516,7 +523,10 @@ let originated_contracts_single (type kind) | ITransaction_result (Transaction_to_contract_result {originated_contracts; _}) -> Ok originated_contracts - | ITransaction_result (Transaction_to_tx_rollup_result _) -> Ok [] + | ITransaction_result + ( Transaction_to_tx_rollup_result _ + | Transaction_to_sc_rollup_result _ ) -> + Ok [] | IOrigination_result {originated_contracts; _} -> Ok originated_contracts | IDelegation_result _ -> Ok []) diff --git a/src/proto_alpha/lib_client/operation_result.ml b/src/proto_alpha/lib_client/operation_result.ml index 90d681a1d383bf7fd93568afadfb07c440516dcf..92363695d7b27c6db7db0c056b7414de717878cd 100644 --- a/src/proto_alpha/lib_client/operation_result.ml +++ b/src/proto_alpha/lib_client/operation_result.ml @@ -443,6 +443,13 @@ let pp_storage_size ppf storage_size = if storage_size <> Z.zero then Format.fprintf ppf "@,Storage size: %s bytes" (Z.to_string storage_size) +let pp_inbox_after ppf inbox_after = + Format.fprintf + ppf + "@,Resulting inbox state: %a" + Sc_rollup.Inbox.pp + inbox_after + let pp_lazy_storage_diff ppf = function | None -> () | Some lazy_storage_diff -> ( @@ -521,6 +528,9 @@ let pp_transaction_result ppf = function pp_balance_updates ppf balance_updates ; Format.fprintf ppf "@,Ticket hash: %a" Ticket_hash.pp ticket_hash ; pp_paid_storage_size_diff ppf paid_storage_size_diff + | Transaction_to_sc_rollup_result {consumed_gas; inbox_after} -> + pp_consumed_gas ppf consumed_gas ; + pp_inbox_after ppf inbox_after let pp_operation_result ~operation_name pp_operation_result ppf = function | Skipped _ -> Format.fprintf ppf "This operation was skipped." @@ -628,11 +638,7 @@ let pp_manager_operation_contents_result ppf op_result = let pp_sc_rollup_add_messages_result (Sc_rollup_add_messages_result {consumed_gas; inbox_after}) = pp_consumed_gas ppf consumed_gas ; - Format.fprintf - ppf - "@,Resulting inbox state: %a" - Sc_rollup.Inbox.pp - inbox_after + pp_inbox_after ppf inbox_after in let pp_sc_rollup_cement_result (Sc_rollup_cement_result {consumed_gas}) = pp_consumed_gas ppf consumed_gas diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 003ae527f1e43a9c28c1e3c2b2f63d595aecac1d..fdd76467c621d3b0ee039bea5f73c04a58dbe2a6 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1189,6 +1189,30 @@ let apply_internal_manager_operation_content : ~payer ~dst_rollup:destination ~since:ctxt_before_op + | Transaction_to_sc_rollup + { + destination; + entrypoint = _; + parameters_ty = _; + parameters = _; + unparsed_parameters = payload; + } -> + assert_sc_rollup_feature_enabled ctxt >>=? fun () -> + (* Adding the message to the inbox. Note that it is safe to ignore the + size diff since only its hash and meta data are stored in the context. + See #3232. *) + Sc_rollup.Inbox.add_internal_message + ctxt + destination + ~payload + ~sender:source + ~source:payer + >|=? fun (inbox_after, _size, ctxt) -> + let consumed_gas = Gas.consumed ~since:ctxt_before_op ~until:ctxt in + let result = + Transaction_to_sc_rollup_result {consumed_gas; inbox_after} + in + (ctxt, ITransaction_result result, []) | Origination { delegate; @@ -2095,6 +2119,7 @@ let burn_transaction_storage_fees ctxt trr ~storage_limit ~payer = ( ctxt, storage_limit, Transaction_to_tx_rollup_result {payload with balance_updates} ) + | Transaction_to_sc_rollup_result _ -> return (ctxt, storage_limit, trr) let burn_origination_storage_fees ctxt { diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index de944f88dd5789afd72789c9bae9a92d0d67072d..f6436fba40d8f2934bfdc196b2ecf4648fb2dd92 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -102,6 +102,15 @@ let contents_of_internal_operation (type kind) entrypoint = Tx_rollup.deposit_entrypoint; parameters = Script.lazy_expr unparsed_parameters; } + | Transaction_to_sc_rollup {destination; entrypoint; unparsed_parameters; _} + -> + Transaction + { + destination = Sc_rollup destination; + amount = Tez.zero; + entrypoint; + parameters = Script.lazy_expr unparsed_parameters; + } | Origination {delegate; code; unparsed_storage; credit; _} -> let script = { @@ -138,6 +147,10 @@ type successful_transaction_result = consumed_gas : Gas.Arith.fp; paid_storage_size_diff : Z.t; } + | Transaction_to_sc_rollup_result of { + consumed_gas : Gas.Arith.fp; + inbox_after : Sc_rollup.Inbox.t; + } type successful_origination_result = { lazy_storage_diff : Lazy_storage.diffs option; @@ -535,6 +548,19 @@ module Manager_result = struct ticket_hash; paid_storage_size_diff; }); + case + ~title:"To_sc_rollup" + (Tag 2) + (obj2 + (dft "consumed_milligas" Gas.Arith.n_fp_encoding Gas.Arith.zero) + (req "inbox_after" Sc_rollup.Inbox.encoding)) + (function + | Transaction_to_sc_rollup_result {consumed_gas; inbox_after} -> + Some (consumed_gas, inbox_after) + | _ -> None) + (function + | consumed_gas, inbox_after -> + Transaction_to_sc_rollup_result {consumed_gas; inbox_after}); ] let[@coq_axiom_with_reason "gadt"] transaction_case = diff --git a/src/proto_alpha/lib_protocol/apply_results.mli b/src/proto_alpha/lib_protocol/apply_results.mli index 8a40565571fc001f1e32213ce60d101a0ae85d13..6d18773b3658d227364d4ccf9c06081791b9c184 100644 --- a/src/proto_alpha/lib_protocol/apply_results.mli +++ b/src/proto_alpha/lib_protocol/apply_results.mli @@ -181,6 +181,10 @@ and successful_transaction_result = consumed_gas : Gas.Arith.fp; paid_storage_size_diff : Z.t; } + | Transaction_to_sc_rollup_result of { + consumed_gas : Gas.Arith.fp; + inbox_after : Sc_rollup.Inbox.t; + } (** Result of applying an origination, either internal or external. *) and successful_origination_result = { diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.ml b/src/proto_alpha/lib_protocol/script_typed_ir.ml index 4eabc3ae5a653d15eb419b455653e20cc2f2e18d..f3731a442d3f9bd814141deed4ba5d4eb0227160 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.ml +++ b/src/proto_alpha/lib_protocol/script_typed_ir.ml @@ -1384,6 +1384,14 @@ and 'kind manager_operation = unparsed_parameters : Script.expr; } -> Kind.transaction manager_operation + | Transaction_to_sc_rollup : { + destination : Sc_rollup.t; + entrypoint : Entrypoint.t; + parameters_ty : ('a, _) ty; + parameters : 'a; + unparsed_parameters : Script.expr; + } + -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; code : Script.expr; @@ -1421,6 +1429,7 @@ let manager_kind : type kind. kind manager_operation -> kind Kind.manager = function | Transaction_to_contract _ -> Kind.Transaction_manager_kind | Transaction_to_tx_rollup _ -> Kind.Transaction_manager_kind + | Transaction_to_sc_rollup _ -> Kind.Transaction_manager_kind | Origination _ -> Kind.Origination_manager_kind | Delegation _ -> Kind.Delegation_manager_kind diff --git a/src/proto_alpha/lib_protocol/script_typed_ir.mli b/src/proto_alpha/lib_protocol/script_typed_ir.mli index b47dffccdba8a438668f766e65c34093a820323d..e677f8ce2858283145854a0ae82d4b4d498ca848 100644 --- a/src/proto_alpha/lib_protocol/script_typed_ir.mli +++ b/src/proto_alpha/lib_protocol/script_typed_ir.mli @@ -1517,6 +1517,14 @@ and 'kind manager_operation = unparsed_parameters : Script.expr; } -> Kind.transaction manager_operation + | Transaction_to_sc_rollup : { + destination : Sc_rollup.t; + entrypoint : Entrypoint.t; + parameters_ty : ('a, _) ty; + parameters : 'a; + unparsed_parameters : Script.expr; + } + -> Kind.transaction manager_operation | Origination : { delegate : Signature.Public_key_hash.t option; code : Script.expr; diff --git a/src/proto_alpha/lib_protocol/test/helpers/block.ml b/src/proto_alpha/lib_protocol/test/helpers/block.ml index 8d941c7d07a97c3c5976741cc564c26d84a64977..29ea1dc32e7c775ff676366d2292973d49d4b7dd 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/block.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/block.ml @@ -758,6 +758,7 @@ let bake_n_with_all_balance_updates ?(baking_mode = Application) ?policy let open Apply_results in fun (Successful_manager_result r) -> match r with + | Transaction_result (Transaction_to_sc_rollup_result _) | Reveal_result _ | Delegation_result _ | Set_deposits_limit_result _ | Tx_rollup_origination_result _ | Tx_rollup_submit_batch_result _ | Tx_rollup_commit_result _ @@ -774,9 +775,8 @@ let bake_n_with_all_balance_updates ?(baking_mode = Application) ?policy | Sc_rollup_recover_bond_result _ -> balance_updates_rev | Transaction_result - (Transaction_to_contract_result {balance_updates; _}) - | Transaction_result - (Transaction_to_tx_rollup_result {balance_updates; _}) + ( Transaction_to_contract_result {balance_updates; _} + | Transaction_to_tx_rollup_result {balance_updates; _} ) | Origination_result {balance_updates; _} | Register_global_constant_result {balance_updates; _} -> List.rev_append balance_updates balance_updates_rev) diff --git a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml index 36a4ae68863278fe9c9015c5ae944099935ff1d4..26a022546c0f79eb6699f6b042eee3b565b16e7e 100644 --- a/src/proto_alpha/lib_protocol/ticket_operations_diff.ml +++ b/src/proto_alpha/lib_protocol/ticket_operations_diff.ml @@ -144,7 +144,6 @@ end let tickets_of_transaction ctxt ~allow_zero_amount_tickets ~destination ~parameters_ty ~parameters = - let destination = Destination.Contract (Originated destination) in Ticket_scanner.type_has_tickets ctxt parameters_ty >>?= fun (has_tickets, ctxt) -> Ticket_scanner.tickets_of_value @@ -181,7 +180,7 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets amount = _; unparsed_parameters = _; entrypoint = _; - destination = Originated destination; + destination = Originated _ as contract; location = _; parameters_ty; parameters; @@ -189,7 +188,7 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets tickets_of_transaction ctxt ~allow_zero_amount_tickets - ~destination + ~destination:(Destination.Contract contract) ~parameters_ty ~parameters | Transaction_to_tx_rollup @@ -203,6 +202,22 @@ let tickets_of_operation ctxt ~allow_zero_amount_tickets tickets = [ex_ticket]; }, ctxt ) + | Transaction_to_sc_rollup + { + destination; + entrypoint = _; + parameters_ty; + parameters; + unparsed_parameters = _; + } -> + (* Note that zero-amount tickets to a rollup is not permitted. *) + let allow_zero_amount_tickets = false in + tickets_of_transaction + ctxt + ~allow_zero_amount_tickets + ~destination:(Destination.Sc_rollup destination) + ~parameters_ty + ~parameters | Origination { delegate = _;