https://gitlab.com/tezos/tezos
Raw File
Tip revision: 3d9fb6c815d6b5155fa28766f6a686a83ce87acd authored by David Turner on 18 May 2022, 19:58:13 UTC
Baker: die early if signer does not support deterministic nonces
Tip revision: 3d9fb6c
operation_result.ml
(*****************************************************************************)
(*                                                                           *)
(* Open Source License                                                       *)
(* Copyright (c) 2018 Dynamic Ledger Solutions, Inc. <contact@tezos.com>     *)
(*                                                                           *)
(* Permission is hereby granted, free of charge, to any person obtaining a   *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense,  *)
(* and/or sell copies of the Software, and to permit persons to whom the     *)
(* Software is furnished to do so, subject to the following conditions:      *)
(*                                                                           *)
(* The above copyright notice and this permission notice shall be included   *)
(* in all copies or substantial portions of the Software.                    *)
(*                                                                           *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL   *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING   *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER       *)
(* DEALINGS IN THE SOFTWARE.                                                 *)
(*                                                                           *)
(*****************************************************************************)

open Protocol
open Alpha_context
open Apply_results

let tez_sym = "\xEA\x9C\xA9"

let pp_internal_operation_result ppf (Apply_results.Internal_contents op)
    pp_result res =
  let {operation; source; _} = op in
  (* For now, try to use the same format as in [pp_manager_operation_content]. *)
  Format.fprintf ppf "@[<v 0>@[<v 2>Internal " ;
  (match operation with
  | Transaction {destination; amount; parameters; entrypoint} ->
      Format.fprintf
        ppf
        "Transaction:@,Amount: %s%a@,From: %a@,To: %a"
        tez_sym
        Tez.pp
        amount
        Contract.pp
        source
        Destination.pp
        destination ;
      if not (Entrypoint.is_default entrypoint) then
        Format.fprintf ppf "@,Entrypoint: %a" Entrypoint.pp entrypoint ;
      if not (Script_repr.is_unit_parameter parameters) then
        let expr =
          WithExceptions.Option.to_exn
            ~none:(Failure "ill-serialized argument")
            (Data_encoding.force_decode parameters)
        in
        Format.fprintf
          ppf
          "@,Parameter: @[<v 0>%a@]"
          Michelson_v1_printer.print_expr
          expr
  | Origination {delegate; credit; script = {code; storage}} -> (
      Format.fprintf
        ppf
        "Origination:@,From: %a@,Credit: %s%a"
        Contract.pp
        source
        tez_sym
        Tez.pp
        credit ;
      let code =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized code")
          (Data_encoding.force_decode code)
      and storage =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized storage")
          (Data_encoding.force_decode storage)
      in
      let {Michelson_v1_parser.source; _} =
        Michelson_v1_printer.unparse_toplevel code
      in
      Format.fprintf
        ppf
        "@,@[<hv 2>Script:@ @[<h>%a@]@,@[<hv 2>Initial storage:@ %a@]"
        Format.pp_print_text
        source
        Michelson_v1_printer.print_expr
        storage ;
      match delegate with
      | None -> Format.fprintf ppf "@,No delegate for this contract"
      | Some delegate ->
          Format.fprintf
            ppf
            "@,Delegate: %a"
            Signature.Public_key_hash.pp
            delegate)
  | Delegation delegate_opt -> (
      Format.fprintf ppf "Delegation:@,Contract: %a@,To: " Contract.pp source ;
      match delegate_opt with
      | None -> Format.pp_print_string ppf "nobody"
      | Some delegate -> Signature.Public_key_hash.pp ppf delegate)) ;

  Format.fprintf ppf "%a@]@]" pp_result res

let pp_internal_operation ppf op =
  pp_internal_operation_result ppf op (fun (_ : Format.formatter) () -> ()) ()

let pp_manager_operation_content (type kind) source pp_result ppf
    ((operation, result) : kind manager_operation * _) =
  (* For now, try to keep formatting in sync with [pp_internal_operation_result]. *)
  Format.fprintf ppf "@[<v 0>@[<v 2>" ;
  (match operation with
  | Transaction {destination; amount; parameters; entrypoint} ->
      Format.fprintf
        ppf
        "Transaction:@,Amount: %s%a@,From: %a@,To: %a"
        tez_sym
        Tez.pp
        amount
        Contract.pp
        source
        Contract.pp
        destination ;
      if not (Entrypoint.is_default entrypoint) then
        Format.fprintf ppf "@,Entrypoint: %a" Entrypoint.pp entrypoint ;
      if not (Script_repr.is_unit_parameter parameters) then
        let expr =
          WithExceptions.Option.to_exn
            ~none:(Failure "ill-serialized argument")
            (Data_encoding.force_decode parameters)
        in
        Format.fprintf
          ppf
          "@,Parameter: @[<v 0>%a@]"
          Michelson_v1_printer.print_expr
          expr
  | Origination {delegate; credit; script = {code; storage}} -> (
      Format.fprintf
        ppf
        "Origination:@,From: %a@,Credit: %s%a"
        Contract.pp
        source
        tez_sym
        Tez.pp
        credit ;
      let code =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized code")
          (Data_encoding.force_decode code)
      and storage =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized storage")
          (Data_encoding.force_decode storage)
      in
      let {Michelson_v1_parser.source; _} =
        Michelson_v1_printer.unparse_toplevel code
      in
      Format.fprintf
        ppf
        "@,@[<hv 2>Script:@ @[<h>%a@]@,@[<hv 2>Initial storage:@ %a@]"
        Format.pp_print_text
        source
        Michelson_v1_printer.print_expr
        storage ;
      match delegate with
      | None -> Format.fprintf ppf "@,No delegate for this contract"
      | Some delegate ->
          Format.fprintf
            ppf
            "@,Delegate: %a"
            Signature.Public_key_hash.pp
            delegate)
  | Reveal key ->
      Format.fprintf
        ppf
        "Revelation of manager public key:@,Contract: %a@,Key: %a"
        Contract.pp
        source
        Signature.Public_key.pp
        key
  | Delegation delegate_opt -> (
      Format.fprintf ppf "Delegation:@,Contract: %a@,To: " Contract.pp source ;
      match delegate_opt with
      | None -> Format.pp_print_string ppf "nobody"
      | Some delegate -> Signature.Public_key_hash.pp ppf delegate)
  | Register_global_constant {value = lazy_value} ->
      let value =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized value")
          (Data_encoding.force_decode lazy_value)
      in
      Format.fprintf
        ppf
        "Register Global:@,Value: %a"
        Michelson_v1_printer.print_expr
        value
  | Set_deposits_limit limit_opt -> (
      Format.fprintf
        ppf
        "Set deposits limit:@,Delegate: %a@,"
        Contract.pp
        source ;
      match limit_opt with
      | None -> Format.pp_print_string ppf "Unlimited deposits"
      | Some limit -> Format.fprintf ppf "Limit: %a" Tez.pp limit)
  | Tx_rollup_origination ->
      Format.fprintf ppf "Tx rollup origination:@,From: %a" Contract.pp source
  | Tx_rollup_submit_batch {tx_rollup; content; burn_limit = _} ->
      Format.fprintf
        ppf
        "Tx rollup transaction:%a, %d bytes, From: %a"
        Tx_rollup.pp
        tx_rollup
        (String.length content)
        Contract.pp
        source
  | Tx_rollup_commit {tx_rollup; commitment} ->
      Format.fprintf
        ppf
        "Tx rollup commitment:%a, %a@,From: %a"
        Tx_rollup.pp
        tx_rollup
        Tx_rollup_commitment.Full.pp
        commitment
        Contract.pp
        source
  | Tx_rollup_return_bond {tx_rollup} ->
      Format.fprintf
        ppf
        "Tx rollup return commitment bond:%a @,From: %a"
        Tx_rollup.pp
        tx_rollup
        Contract.pp
        source
  | Tx_rollup_finalize_commitment {tx_rollup} ->
      Format.fprintf
        ppf
        "Tx rollup finalize commitment:%a @,From: %a"
        Tx_rollup.pp
        tx_rollup
        Contract.pp
        source
  | Tx_rollup_remove_commitment {tx_rollup; _} ->
      Format.fprintf
        ppf
        "Tx rollup remove commitment:%a @,From: %a"
        Tx_rollup.pp
        tx_rollup
        Contract.pp
        source
  | Tx_rollup_rejection {tx_rollup; _} ->
      (* FIXME/TORU *)
      Format.fprintf
        ppf
        "Tx rollup rejection:%a @,From: %a"
        Tx_rollup.pp
        tx_rollup
        Contract.pp
        source
  | Tx_rollup_dispatch_tickets {tx_rollup; _} ->
      Format.fprintf
        ppf
        "Tx rollup dispatch tickets:%a@,From: %a"
        Tx_rollup.pp
        tx_rollup
        Contract.pp
        source
  | Transfer_ticket _ ->
      Format.fprintf ppf "Transfer tickets:@,From: %a" Contract.pp source
  | Sc_rollup_originate {kind; boot_sector; parameters_ty} ->
      let (module R : Sc_rollups.PVM.S) = Sc_rollups.of_kind kind in
      let parameters_ty =
        WithExceptions.Option.to_exn
          ~none:(Failure "ill-serialized parameters type")
          (Data_encoding.force_decode parameters_ty)
      in
      Format.fprintf
        ppf
        "Originate smart contract rollup of kind %s and type %a with boot \
         sector '%a'"
        R.name
        Michelson_v1_printer.print_expr
        parameters_ty
        R.pp_boot_sector
        boot_sector
  | Sc_rollup_add_messages {rollup; messages = _} ->
      Format.fprintf
        ppf
        "Add a message to the inbox of the smart contract rollup at address %a"
        Sc_rollup.Address.pp
        rollup
  | Sc_rollup_cement {rollup; commitment} ->
      Format.fprintf
        ppf
        "Cement the commitment %a in the smart contract rollup at address %a"
        Sc_rollup.Commitment.Hash.pp
        commitment
        Sc_rollup.Address.pp
        rollup
  | Sc_rollup_publish {rollup; commitment} ->
      Format.fprintf
        ppf
        "Publish commitment %a in the smart contract rollup at address %a"
        Sc_rollup.Commitment.pp
        commitment
        Sc_rollup.Address.pp
        rollup
  | Sc_rollup_refute {rollup; opponent; refutation} ->
      Format.fprintf
        ppf
        "Refute staker %a in the smart contract rollup at address %a using \
         refutation %a"
        Sc_rollup.Staker.pp
        opponent
        Sc_rollup.Address.pp
        rollup
        Sc_rollup.Game.pp_refutation
        refutation
  | Sc_rollup_timeout {rollup; stakers} ->
      Format.fprintf
        ppf
        "Punish one of the two stakers %a and %a by timeout in the smart \
         contract rollup at address %a"
        Sc_rollup.Staker.pp
        (fst stakers)
        Sc_rollup.Staker.pp
        (snd stakers)
        Sc_rollup.Address.pp
        rollup) ;

  Format.fprintf ppf "%a@]@]" pp_result result

let pp_balance_updates ppf = function
  | [] -> ()
  | balance_updates ->
      let open Receipt in
      (* For dry runs, the baker's key is zero
         (tz1Ke2h7sDdakHJQh8WX4Z372du1KChsksyU). Instead of printing this
         key hash, we want to make the result more informative. *)
      let pp_baker ppf baker =
        if Signature.Public_key_hash.equal baker Signature.Public_key_hash.zero
        then Format.fprintf ppf "the baker who will include this operation"
        else Signature.Public_key_hash.pp ppf baker
      in
      let balance_updates =
        List.map
          (fun (balance, update, origin) ->
            let balance =
              match balance with
              | Contract c -> Format.asprintf "%a" Contract.pp c
              | Block_fees -> "payload fees(the block proposer)"
              | Deposits pkh -> Format.asprintf "deposits(%a)" pp_baker pkh
              | Nonce_revelation_rewards -> "nonce revelation rewards"
              | Double_signing_evidence_rewards ->
                  "double signing evidence rewards"
              | Endorsing_rewards -> "endorsing rewards"
              | Baking_rewards -> "baking rewards"
              | Baking_bonuses -> "baking bonuses"
              | Storage_fees -> "storage fees"
              | Double_signing_punishments -> "double signing punishments"
              | Lost_endorsing_rewards (pkh, p, r) ->
                  let reason =
                    match (p, r) with
                    | false, false -> ""
                    | false, true -> ",revelation"
                    | true, false -> ",participation"
                    | true, true -> ",participation,revelation"
                  in
                  Format.asprintf
                    "lost endorsing rewards(%a%s)"
                    pp_baker
                    pkh
                    reason
              | Liquidity_baking_subsidies -> "liquidity baking subsidies"
              | Burned -> "burned"
              | Commitments bpkh ->
                  Format.asprintf
                    "commitment(%a)"
                    Blinded_public_key_hash.pp
                    bpkh
              | Bootstrap -> "bootstrap"
              | Invoice -> "invoices"
              | Initial_commitments -> "initial commitments"
              | Minted -> "minted"
              | Frozen_bonds (contract, bond_id) ->
                  Format.asprintf
                    "Frozen_bonds(%a,%a)"
                    Contract.pp
                    contract
                    Bond_id.pp
                    bond_id
              | Tx_rollup_rejection_rewards -> "tx rollup rejection rewards"
              | Tx_rollup_rejection_punishments ->
                  "tx rollup rejection punishments"
            in
            let balance =
              match origin with
              | Block_application -> balance
              | Protocol_migration -> Format.asprintf "migration %s" balance
              | Subsidy -> Format.asprintf "subsidy %s" balance
              | Simulation -> Format.asprintf "simulation %s" balance
            in
            (balance, update))
          balance_updates
      in
      let column_size =
        List.fold_left
          (fun acc (balance, _) -> Compare.Int.max acc (String.length balance))
          0
          balance_updates
      in
      let pp_update ppf = function
        | Credited amount -> Format.fprintf ppf "+%s%a" tez_sym Tez.pp amount
        | Debited amount -> Format.fprintf ppf "-%s%a" tez_sym Tez.pp amount
      in
      let pp_one ppf (balance, update) =
        let to_fill = column_size + 3 - String.length balance in
        let filler = String.make to_fill '.' in
        Format.fprintf ppf "%s %s %a" balance filler pp_update update
      in
      Format.fprintf
        ppf
        "@[<v 0>%a@]"
        (Format.pp_print_list pp_one)
        balance_updates

let pp_balance_updates_opt ppf balance_updates =
  match balance_updates with
  | [] -> ()
  | balance_updates ->
      Format.fprintf
        ppf
        "@,Balance updates:@,  %a"
        pp_balance_updates
        balance_updates

let pp_manager_operation_contents_and_result ppf
    ( Manager_operation
        {source; fee; operation; counter; gas_limit; storage_limit},
      Manager_operation_result
        {balance_updates; operation_result; internal_operation_results} ) =
  let pp_lazy_storage_diff = function
    | None -> ()
    | Some lazy_storage_diff -> (
        let big_map_diff =
          Contract.Legacy_big_map_diff.of_lazy_storage_diff lazy_storage_diff
        in
        match (big_map_diff :> Contract.Legacy_big_map_diff.item list) with
        | [] -> ()
        | _ :: _ ->
            (* TODO: print all lazy storage diff *)
            Format.fprintf
              ppf
              "@,@[<v 2>Updated big_maps:@ %a@]"
              Michelson_v1_printer.print_big_map_diff
              lazy_storage_diff)
  in
  let pp_transaction_result = function
    | Transaction_to_contract_result
        {
          balance_updates;
          consumed_gas;
          storage;
          originated_contracts;
          storage_size;
          paid_storage_size_diff;
          lazy_storage_diff;
          allocated_destination_contract = _;
        } ->
        (match originated_contracts with
        | [] -> ()
        | contracts ->
            Format.fprintf
              ppf
              "@,@[<v 2>Originated contracts:@,%a@]"
              (Format.pp_print_list Contract.pp)
              contracts) ;
        (match storage with
        | None -> ()
        | Some expr ->
            Format.fprintf
              ppf
              "@,@[<hv 2>Updated storage:@ %a@]"
              Michelson_v1_printer.print_expr
              expr) ;
        pp_lazy_storage_diff lazy_storage_diff ;
        if storage_size <> Z.zero then
          Format.fprintf
            ppf
            "@,Storage size: %s bytes"
            (Z.to_string storage_size) ;
        if paid_storage_size_diff <> Z.zero then
          Format.fprintf
            ppf
            "@,Paid storage size diff: %s bytes"
            (Z.to_string paid_storage_size_diff) ;
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
        pp_balance_updates_opt ppf balance_updates
    | Transaction_to_tx_rollup_result
        {balance_updates; consumed_gas; ticket_hash; paid_storage_size_diff} ->
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
        pp_balance_updates_opt ppf balance_updates ;
        Format.fprintf ppf "@,Ticket hash: %a" Ticket_hash.pp ticket_hash ;
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
        if paid_storage_size_diff <> Z.zero then
          Format.fprintf
            ppf
            "@,Paid storage size diff: %s bytes"
            (Z.to_string paid_storage_size_diff)
  in

  let pp_origination_result
      (Origination_result
        {
          lazy_storage_diff;
          balance_updates;
          consumed_gas;
          originated_contracts;
          storage_size;
          paid_storage_size_diff;
        }) =
    (match originated_contracts with
    | [] -> ()
    | contracts ->
        Format.fprintf
          ppf
          "@,@[<v 2>Originated contracts:@,%a@]"
          (Format.pp_print_list Contract.pp)
          contracts) ;
    if storage_size <> Z.zero then
      Format.fprintf ppf "@,Storage size: %s bytes" (Z.to_string storage_size) ;
    pp_lazy_storage_diff lazy_storage_diff ;
    if paid_storage_size_diff <> Z.zero then
      Format.fprintf
        ppf
        "@,Paid storage size diff: %s bytes"
        (Z.to_string paid_storage_size_diff) ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    pp_balance_updates_opt ppf balance_updates
  in
  let pp_register_global_constant_result
      (Register_global_constant_result
        {balance_updates; consumed_gas; size_of_constant; global_address}) =
    (match balance_updates with
    | [] ->
        (* Not possible - register global constant operation always returns
           balance updates. *)
        assert false
    | balance_updates -> pp_balance_updates_opt ppf balance_updates) ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf ppf "@,Storage size: %s bytes" (Z.to_string size_of_constant) ;
    Format.fprintf ppf "@,Global address: %a" Script_expr_hash.pp global_address
  in
  let pp_tx_rollup_result
      (Tx_rollup_origination_result
        {balance_updates; consumed_gas; originated_tx_rollup}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf
      ppf
      "@,Originated tx rollup: %a"
      Tx_rollup.pp
      originated_tx_rollup
  in
  let pp_tx_rollup_submit_batch_result
      (Tx_rollup_submit_batch_result
        {balance_updates; consumed_gas; paid_storage_size_diff}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    if paid_storage_size_diff <> Z.zero then
      Format.fprintf
        ppf
        "@,Paid storage size diff: %s bytes"
        (Z.to_string paid_storage_size_diff)
  in
  let pp_tx_rollup_commit_result
      (Tx_rollup_commit_result {balance_updates; consumed_gas}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
  in
  let pp_tx_rollup_return_bond_result
      (Tx_rollup_return_bond_result {balance_updates; consumed_gas}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
  in
  let pp_tx_rollup_finalize_commitment_result
      (Tx_rollup_finalize_commitment_result
        {balance_updates; consumed_gas; level}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf ppf "@finalized level:@,  %a" Tx_rollup_level.pp level
  in
  let pp_tx_rollup_remove_commitment_result
      (Tx_rollup_remove_commitment_result
        {balance_updates; consumed_gas; level}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf ppf "@finalized level:@,  %a" Tx_rollup_level.pp level
  in
  let pp_tx_rollup_rejection_result
      (Tx_rollup_rejection_result {balance_updates; consumed_gas}) =
    Format.fprintf
      ppf
      "@,Balance updates:@,  %a"
      pp_balance_updates
      balance_updates ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
  in
  let pp_tx_rollup_dispatch_tickets_result
      (Tx_rollup_dispatch_tickets_result
        {balance_updates; consumed_gas; paid_storage_size_diff}) =
    if paid_storage_size_diff <> Z.zero then
      Format.fprintf
        ppf
        "@,Paid storage size diff: %s bytes"
        (Z.to_string paid_storage_size_diff) ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    pp_balance_updates_opt ppf balance_updates
  in
  let pp_transfer_ticket_result
      (Transfer_ticket_result
        {balance_updates; consumed_gas; paid_storage_size_diff}) =
    if paid_storage_size_diff <> Z.zero then
      Format.fprintf
        ppf
        "@,Paid storage size diff: %s bytes"
        (Z.to_string paid_storage_size_diff) ;
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    pp_balance_updates_opt ppf balance_updates
  in
  let pp_sc_rollup_originate_result
      (Sc_rollup_originate_result
        {address; consumed_gas; size; balance_updates}) =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf ppf "@,Storage size: %s bytes" (Z.to_string size) ;
    Format.fprintf ppf "@,Address: %a" Sc_rollup.Address.pp address ;
    pp_balance_updates_opt ppf balance_updates
  in
  let pp_sc_rollup_add_messages_result
      (Sc_rollup_add_messages_result {consumed_gas; inbox_after}) =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf
      ppf
      "@,Resulting inbox state: %a"
      Sc_rollup.Inbox.pp
      inbox_after
  in
  let pp_sc_rollup_cement_result (Sc_rollup_cement_result {consumed_gas}) =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
  in
  let pp_sc_rollup_publish_result
      (Sc_rollup_publish_result {consumed_gas; staked_hash; published_at_level})
      =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf
      ppf
      "@,Hash of commit: %a"
      Sc_rollup.Commitment.Hash.pp
      staked_hash ;
    Format.fprintf
      ppf
      "@,Commitment published at level: %a"
      Raw_level.pp
      published_at_level
  in
  let pp_sc_rollup_refute_result
      (Sc_rollup_refute_result {consumed_gas; status}) =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf
      ppf
      "@,Refutation game status: %a"
      Sc_rollup.Game.pp_status
      status
  in
  let pp_sc_rollup_timeout_result
      (Sc_rollup_timeout_result {consumed_gas; status}) =
    Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ;
    Format.fprintf
      ppf
      "@,Refutation game status: %a"
      Sc_rollup.Game.pp_status
      status
  in
  let pp_result (type kind) ppf (result : kind manager_operation_result) =
    Format.fprintf ppf "@," ;
    match result with
    | Skipped _ -> Format.fprintf ppf "This operation was skipped"
    | Failed (_, _errs) -> Format.fprintf ppf "This operation FAILED."
    | Applied (Reveal_result {consumed_gas}) ->
        Format.fprintf ppf "This revelation was successfully applied" ;
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
    | Backtracked (Reveal_result _, _) ->
        Format.fprintf
          ppf
          "@[<v 0>This revelation was BACKTRACKED, its expected effects were \
           NOT applied.@]"
    | Applied (Delegation_result {consumed_gas}) ->
        Format.fprintf ppf "This delegation was successfully applied" ;
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
    | Backtracked (Delegation_result _, _) ->
        Format.fprintf
          ppf
          "@[<v 0>This delegation was BACKTRACKED, its expected effects were \
           NOT applied.@]"
    | Applied (Set_deposits_limit_result {consumed_gas}) ->
        Format.fprintf ppf "The deposits limit was successfully set" ;
        Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas
    | Backtracked (Set_deposits_limit_result _, _) ->
        Format.fprintf
          ppf
          "@[<v 0>This deposits limit modification was BACKTRACKED, its \
           expected effects were NOT applied.@]"
    | Applied (Transaction_result tx) ->
        Format.fprintf ppf "This transaction was successfully applied" ;
        pp_transaction_result tx
    | Backtracked (Transaction_result tx, _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This transaction was BACKTRACKED, its expected effects (as \
           follow) were NOT applied.@]" ;
        pp_transaction_result tx
    | Applied (Origination_result _ as op) ->
        Format.fprintf ppf "This origination was successfully applied" ;
        pp_origination_result op
    | Backtracked ((Origination_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This origination was BACKTRACKED, its expected effects (as \
           follow) were NOT applied.@]" ;
        pp_origination_result op
    | Applied (Register_global_constant_result _ as op) ->
        Format.fprintf
          ppf
          "This global constant registration was successfully applied" ;
        pp_register_global_constant_result op
    | Backtracked ((Register_global_constant_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This registration of a global constant was BACKTRACKED, its \
           expected effects (as follow) were NOT applied.@]" ;
        pp_register_global_constant_result op
    | Applied (Tx_rollup_origination_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup origination operation was successfully applied" ;
        pp_tx_rollup_result op
    | Backtracked ((Tx_rollup_origination_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This rollup operation was BACKTRACKED, its expected effects \
           (as follow) were NOT applied.@]" ;
        pp_tx_rollup_result op
    | Applied (Tx_rollup_submit_batch_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup submit operation was successfully applied" ;
        pp_tx_rollup_submit_batch_result op
    | Backtracked ((Tx_rollup_submit_batch_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This rollup submit operation was BACKTRACKED, its expected \
           effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_submit_batch_result op
    | Applied (Tx_rollup_commit_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup commit operation was successfully applied" ;
        pp_tx_rollup_commit_result op
    | Backtracked ((Tx_rollup_commit_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup commit operation was BACKTRACKED, its \
           expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_commit_result op
    | Applied (Tx_rollup_return_bond_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup return commitment bond operation was successfully \
           applied" ;
        pp_tx_rollup_return_bond_result op
    | Backtracked ((Tx_rollup_return_bond_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup return commitment bond operation was \
           BACKTRACKED, its expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_return_bond_result op
    | Applied (Tx_rollup_finalize_commitment_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup finalize operation was successfully applied" ;
        pp_tx_rollup_finalize_commitment_result op
    | Backtracked ((Tx_rollup_finalize_commitment_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup finalize operation was BACKTRACKED, its \
           expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_finalize_commitment_result op
    | Applied (Tx_rollup_remove_commitment_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup remove operation was successfully applied" ;
        pp_tx_rollup_remove_commitment_result op
    | Backtracked ((Tx_rollup_remove_commitment_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup remove operation was BACKTRACKED, its \
           expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_remove_commitment_result op
    | Applied (Tx_rollup_rejection_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup rejection operation was successfully applied" ;
        pp_tx_rollup_rejection_result op
    | Backtracked ((Tx_rollup_rejection_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup rejection operation was BACKTRACKED, its \
           expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_rejection_result op
    | Applied (Tx_rollup_dispatch_tickets_result _ as op) ->
        Format.fprintf
          ppf
          "This tx rollup reveal_withdrawals operation was successfully applied" ;
        pp_tx_rollup_dispatch_tickets_result op
    | Backtracked ((Tx_rollup_dispatch_tickets_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This tx rollup reveal_withdrawals rollup operation was \
           BACKTRACKED, its expected effects (as follow) were NOT applied.@]" ;
        pp_tx_rollup_dispatch_tickets_result op
    | Applied (Transfer_ticket_result _ as op) ->
        Format.fprintf
          ppf
          "This transfer ticket operation was successfully applied" ;
        pp_transfer_ticket_result op
    | Backtracked ((Transfer_ticket_result _ as op), _err) ->
        Format.fprintf
          ppf
          "@[<v 0>This transfer ticket operation was BACKTRACKED, its expected \
           effects (as follow) were NOT applied.@]" ;
        pp_transfer_ticket_result op
    | Applied (Sc_rollup_originate_result _ as op) ->
        Format.fprintf
          ppf
          "This smart contract rollup origination was successfully applied" ;
        pp_sc_rollup_originate_result op
    | Backtracked ((Sc_rollup_originate_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This rollup origination was BACKTRACKED, its expected \
           effects (as follow) were NOT applied.@]" ;
        pp_sc_rollup_originate_result op
    | Applied (Sc_rollup_add_messages_result _ as op) ->
        Format.fprintf
          ppf
          "This operation sending a message to a smart contract rollup was \
           successfully applied" ;
        pp_sc_rollup_add_messages_result op
    | Backtracked ((Sc_rollup_add_messages_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This operation sending a message to a smart contract rollup \
           was BACKTRACKED, its expected effects (as follow) were NOT \
           applied.@]" ;
        pp_sc_rollup_add_messages_result op
    | Applied (Sc_rollup_cement_result _ as op) ->
        Format.fprintf
          ppf
          "This operation cementing a commitment on a smart contract rollup \
           was successfully applied" ;
        pp_sc_rollup_cement_result op
    | Backtracked ((Sc_rollup_cement_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This operation cementing a commitment on a smart contract \
           rollup was BACKTRACKED, its expected effects (as follow) were NOT \
           applied.@]" ;
        pp_sc_rollup_cement_result op
    | Applied (Sc_rollup_publish_result _ as op) ->
        Format.fprintf
          ppf
          "This operation publishing a commitment on a smart contract rollup \
           was successfully applied" ;
        pp_sc_rollup_publish_result op
    | Backtracked ((Sc_rollup_publish_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This operation publishing a commitment on a smart contract \
           rollup was BACKTRACKED, its expected effects (as follow) were NOT \
           applied.@]" ;
        pp_sc_rollup_publish_result op
    | Applied (Sc_rollup_refute_result _ as op) ->
        Format.fprintf
          ppf
          "This operation playing a refutation game step on a smart contract \
           rollup was successfully applied" ;
        pp_sc_rollup_refute_result op
    | Backtracked ((Sc_rollup_refute_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This operation playing a refutation game step on a smart \
           contract rollup was BACKTRACKED, its expected effects (as follow) \
           were NOT applied.@]" ;
        pp_sc_rollup_refute_result op
    | Applied (Sc_rollup_timeout_result _ as op) ->
        Format.fprintf
          ppf
          "This operation to end a refutation game on a smart contract rollup \
           by timeout was successfully applied" ;
        pp_sc_rollup_timeout_result op
    | Backtracked ((Sc_rollup_timeout_result _ as op), _errs) ->
        Format.fprintf
          ppf
          "@[<v 0>This operation to end a refutation game on a smart contract \
           rollup by timeout was BACKTRACKED, its expected effects (as follow) \
           were NOT applied.@]" ;
        pp_sc_rollup_timeout_result op
  in

  Format.fprintf
    ppf
    "@[<v 0>@[<v 2>Manager signed operations:@,\
     From: %a@,\
     Fee to the baker: %s%a@,\
     Expected counter: %s@,\
     Gas limit: %a@,\
     Storage limit: %s bytes"
    Signature.Public_key_hash.pp
    source
    tez_sym
    Tez.pp
    fee
    (Z.to_string counter)
    Gas.Arith.pp_integral
    gas_limit
    (Z.to_string storage_limit) ;
  pp_balance_updates_opt ppf balance_updates ;
  Format.fprintf
    ppf
    "@,%a"
    (pp_manager_operation_content (Contract.Implicit source) pp_result)
    (operation, operation_result) ;
  (match internal_operation_results with
  | [] -> ()
  | _ :: _ ->
      Format.fprintf
        ppf
        "@,@[<v 2>Internal operations:@ %a@]"
        (Format.pp_print_list
           (fun ppf (Internal_manager_operation_result (op, res)) ->
             pp_internal_operation_result
               ppf
               (Internal_contents op)
               pp_result
               res))
        internal_operation_results) ;
  Format.fprintf ppf "@]"

let rec pp_contents_and_result_list :
    type kind. Format.formatter -> kind contents_and_result_list -> unit =
 fun ppf -> function
  | Single_and_result
      (Seed_nonce_revelation {level; nonce}, Seed_nonce_revelation_result bus)
    ->
      Format.fprintf
        ppf
        "@[<v 2>Seed nonce revelation:@,\
         Level: %a@,\
         Nonce (hash): %a@,\
         Balance updates:@,\
         %a@]"
        Raw_level.pp
        level
        Nonce_hash.pp
        (Nonce.hash nonce)
        pp_balance_updates
        bus
  | Single_and_result
      (Double_baking_evidence {bh1; bh2}, Double_baking_evidence_result bus) ->
      Format.fprintf
        ppf
        "@[<v 2>Double baking evidence:@,\
         Exhibit A: %a@,\
         Exhibit B: %a@,\
         Balance updates:@,\
         %a@]"
        Block_hash.pp
        (Block_header.hash bh1)
        Block_hash.pp
        (Block_header.hash bh2)
        pp_balance_updates
        bus
  | Single_and_result
      ( Preendorsement {level; _},
        Preendorsement_result {balance_updates; delegate; preendorsement_power}
      ) ->
      Format.fprintf
        ppf
        "@[<v 2>Preendorsement:@,\
         Level: %a@,\
         Balance updates:%a@,\
         Delegate: %a@,\
         Preendorsement Power: %d@]"
        Raw_level.pp
        level
        pp_balance_updates
        balance_updates
        Signature.Public_key_hash.pp
        delegate
        preendorsement_power
  | Single_and_result
      ( Endorsement {level; _},
        Endorsement_result {balance_updates; delegate; endorsement_power} ) ->
      Format.fprintf
        ppf
        "@[<v 2>Endorsement:@,\
         Level: %a@,\
         Balance updates:%a@,\
         Delegate: %a@,\
         Endorsement power: %d@]"
        Raw_level.pp
        level
        pp_balance_updates
        balance_updates
        Signature.Public_key_hash.pp
        delegate
        endorsement_power
  | Single_and_result
      ( Double_endorsement_evidence {op1; op2},
        Double_endorsement_evidence_result bus ) ->
      Format.fprintf
        ppf
        "@[<v 2>Double endorsement evidence:@,\
         Exhibit A: %a@,\
         Exhibit B: %a@,\
         Balance updates:@,\
        \  %a@]"
        Operation_hash.pp
        (Operation.hash op1)
        Operation_hash.pp
        (Operation.hash op2)
        pp_balance_updates
        bus
  | Single_and_result
      ( Double_preendorsement_evidence {op1; op2},
        Double_preendorsement_evidence_result bus ) ->
      Format.fprintf
        ppf
        "@[<v 2>Double preendorsement evidence:@,\
         Exhibit A: %a@,\
         Exhibit B: %a@,\
         Balance updates:@,\
        \  %a@]"
        Operation_hash.pp
        (Operation.hash op1)
        Operation_hash.pp
        (Operation.hash op2)
        pp_balance_updates
        bus
  | Single_and_result (Activate_account {id; _}, Activate_account_result bus) ->
      Format.fprintf
        ppf
        "@[<v 2>Genesis account activation:@,\
         Account: %a@,\
         Balance updates:@,\
        \  %a@]"
        Ed25519.Public_key_hash.pp
        id
        pp_balance_updates
        bus
  | Single_and_result (Proposals {source; period; proposals}, Proposals_result)
    ->
      Format.fprintf
        ppf
        "@[<v 2>Proposals:@,From: %a@,Period: %ld@,Protocols:@,  @[<v 0>%a@]@]"
        Signature.Public_key_hash.pp
        source
        period
        (Format.pp_print_list Protocol_hash.pp)
        proposals
  | Single_and_result (Ballot {source; period; proposal; ballot}, Ballot_result)
    ->
      Format.fprintf
        ppf
        "@[<v 2>Ballot:@,From: %a@,Period: %ld@,Protocol: %a@,Vote: %a@]"
        Signature.Public_key_hash.pp
        source
        period
        Protocol_hash.pp
        proposal
        Data_encoding.Json.pp
        (Data_encoding.Json.construct Vote.ballot_encoding ballot)
  | Single_and_result (Failing_noop _arbitrary, _) ->
      (* the Failing_noop operation always fails and can't have result *)
      .
  | Single_and_result
      ((Manager_operation _ as op), (Manager_operation_result _ as res)) ->
      Format.fprintf ppf "%a" pp_manager_operation_contents_and_result (op, res)
  | Cons_and_result
      ((Manager_operation _ as op), (Manager_operation_result _ as res), rest)
    ->
      Format.fprintf
        ppf
        "%a@\n%a"
        pp_manager_operation_contents_and_result
        (op, res)
        pp_contents_and_result_list
        rest

let pp_operation_result ppf
    ((op, res) : 'kind contents_list * 'kind contents_result_list) =
  Format.fprintf ppf "@[<v 0>" ;
  let contents_and_result_list = Apply_results.pack_contents_list op res in
  pp_contents_and_result_list ppf contents_and_result_list ;
  Format.fprintf ppf "@]@."
back to top