diff --git a/docs/alpha/token_management.rst b/docs/alpha/token_management.rst index 57276062f6c6fd32bdd446bb3861c422c6b3fbd2..d4b2622bd50aec8e211f7cbdddb511704de27ebd 100644 --- a/docs/alpha/token_management.rst +++ b/docs/alpha/token_management.rst @@ -97,7 +97,7 @@ The field ``kind`` allows to identify the type of container account, it can have Accounts in this category are further identified by the following additional fields: - the field ``contract`` contains the public key hash of the implicit account, or the contract hash of the originated account - - the field ``bond_id`` contains the identifier of the bond (e.g. a rollup hash if the bond is associated to a transaction rollup). + - the field ``bond_id`` contains the identifier of the bond (e.g. a rollup hash if the bond is associated to a transaction or a smart contract rollup). * ``"accumulator"`` represents accounts used to store tokens for some short period of time. This type of account is further identified by the additional field ``category`` whose (only possible) value ``"block fees"`` designates the container account used to collect manager operation fees while block's operations are being applied. Other categories may be added in the future. @@ -121,6 +121,7 @@ The field ``category`` of a sink account may have one of the following values: - the field ``participation`` has the value ``"true"`` if participation was not sufficient and has the value ``"false"`` otherwise - the field ``revelation`` has the value ``"true"`` if the delegate has not revealed his nonce and has the value ``"false"`` otherwise. * ``"Tx_rollup_rejection_punishments"`` is the destination of tokens burned as punishment for submitting erroneous commitments +* ``"Sc_rollup_refutation_punishments"`` is the destination of tokens burned as punishment for submitting bad commitments that have been refuted * ``"burned"`` is only for internal use and testing. It will not appear on mainnet, but may appear on test networks or in sandboxed mode. diff --git a/src/proto_alpha/lib_client/mockup.ml b/src/proto_alpha/lib_client/mockup.ml index 3b65fa98047c0f472c79452e0c29eafc8accf4de..5f44dfe90f2c4b2fddb7a597b2ddc71229078bfa 100644 --- a/src/proto_alpha/lib_client/mockup.ml +++ b/src/proto_alpha/lib_client/mockup.ml @@ -91,7 +91,7 @@ module Protocol_constants_overrides = struct sc_rollup_origination_size : int option; sc_rollup_challenge_window_in_blocks : int option; sc_rollup_max_available_messages : int option; - sc_rollup_stake_amount_in_mutez : int option; + sc_rollup_stake_amount : Tez.t option; sc_rollup_commitment_period_in_blocks : int option; sc_rollup_commitment_storage_size_in_bytes : int option; sc_rollup_max_lookahead_in_blocks : int32 option; @@ -166,7 +166,7 @@ module Protocol_constants_overrides = struct c.sc_rollup_origination_size, c.sc_rollup_challenge_window_in_blocks, c.sc_rollup_max_available_messages, - c.sc_rollup_stake_amount_in_mutez, + c.sc_rollup_stake_amount, c.sc_rollup_commitment_period_in_blocks, c.sc_rollup_commitment_storage_size_in_bytes, c.sc_rollup_max_lookahead_in_blocks, @@ -231,7 +231,7 @@ module Protocol_constants_overrides = struct sc_rollup_origination_size, sc_rollup_challenge_window_in_blocks, sc_rollup_max_available_messages, - sc_rollup_stake_amount_in_mutez, + sc_rollup_stake_amount, sc_rollup_commitment_period_in_blocks, sc_rollup_commitment_storage_size_in_bytes, sc_rollup_max_lookahead_in_blocks, @@ -294,7 +294,7 @@ module Protocol_constants_overrides = struct sc_rollup_origination_size; sc_rollup_challenge_window_in_blocks; sc_rollup_max_available_messages; - sc_rollup_stake_amount_in_mutez; + sc_rollup_stake_amount; sc_rollup_commitment_period_in_blocks; sc_rollup_commitment_storage_size_in_bytes; sc_rollup_max_lookahead_in_blocks; @@ -385,7 +385,7 @@ module Protocol_constants_overrides = struct (opt "sc_rollup_origination_size" int31) (opt "sc_rollup_challenge_window_in_blocks" int31) (opt "sc_rollup_max_available_messages" int31) - (opt "sc_rollup_stake_amount_in_mutez" int31) + (opt "sc_rollup_stake_amount" Tez.encoding) (opt "sc_rollup_commitment_period_in_blocks" int31) @@ -490,8 +490,7 @@ module Protocol_constants_overrides = struct Some parametric.sc_rollup_challenge_window_in_blocks; sc_rollup_max_available_messages = Some parametric.sc_rollup_max_available_messages; - sc_rollup_stake_amount_in_mutez = - Some parametric.sc_rollup_stake_amount_in_mutez; + sc_rollup_stake_amount = Some parametric.sc_rollup_stake_amount; sc_rollup_commitment_period_in_blocks = Some parametric.sc_rollup_commitment_period_in_blocks; sc_rollup_commitment_storage_size_in_bytes = @@ -567,7 +566,7 @@ module Protocol_constants_overrides = struct sc_rollup_origination_size = None; sc_rollup_challenge_window_in_blocks = None; sc_rollup_max_available_messages = None; - sc_rollup_stake_amount_in_mutez = None; + sc_rollup_stake_amount = None; sc_rollup_commitment_period_in_blocks = None; sc_rollup_commitment_storage_size_in_bytes = None; sc_rollup_max_lookahead_in_blocks = None; @@ -1062,10 +1061,10 @@ module Protocol_constants_overrides = struct Option.value ~default:c.sc_rollup_max_available_messages o.sc_rollup_max_available_messages; - sc_rollup_stake_amount_in_mutez = + sc_rollup_stake_amount = Option.value - ~default:c.sc_rollup_stake_amount_in_mutez - o.sc_rollup_stake_amount_in_mutez; + ~default:c.sc_rollup_stake_amount + o.sc_rollup_stake_amount; sc_rollup_commitment_period_in_blocks = Option.value ~default:c.sc_rollup_commitment_period_in_blocks diff --git a/src/proto_alpha/lib_client/operation_result.ml b/src/proto_alpha/lib_client/operation_result.ml index 7e41f3d1bbd625564f1d7ace9b0e3374ce15f49a..a2bf8f51489d09847cd017df16b6621b39c3c7a8 100644 --- a/src/proto_alpha/lib_client/operation_result.ml +++ b/src/proto_alpha/lib_client/operation_result.ml @@ -423,6 +423,8 @@ let pp_balance_updates ppf = function | Tx_rollup_rejection_rewards -> "tx rollup rejection rewards" | Tx_rollup_rejection_punishments -> "tx rollup rejection punishments" + | Sc_rollup_refutation_punishments -> + "sc rollup refutation punishments" in let balance = match origin with @@ -707,8 +709,8 @@ let pp_manager_operation_contents_and_result ppf 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}) - = + (Sc_rollup_publish_result + {consumed_gas; staked_hash; published_at_level; balance_updates}) = Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ; Format.fprintf ppf @@ -719,25 +721,28 @@ let pp_manager_operation_contents_and_result ppf ppf "@,Commitment published at level: %a" Raw_level.pp - published_at_level + published_at_level ; + pp_balance_updates_opt ppf balance_updates in let pp_sc_rollup_refute_result - (Sc_rollup_refute_result {consumed_gas; status}) = + (Sc_rollup_refute_result {consumed_gas; status; balance_updates}) = Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ; Format.fprintf ppf "@,Refutation game status: %a" Sc_rollup.Game.pp_status - status + status ; + pp_balance_updates_opt ppf balance_updates in let pp_sc_rollup_timeout_result - (Sc_rollup_timeout_result {consumed_gas; status}) = + (Sc_rollup_timeout_result {consumed_gas; status; balance_updates}) = Format.fprintf ppf "@,Consumed gas: %a" Gas.Arith.pp consumed_gas ; Format.fprintf ppf "@,Refutation game status: %a" Sc_rollup.Game.pp_status - status + status ; + pp_balance_updates_opt ppf balance_updates in let pp_sc_rollup_atomic_batch_result (Sc_rollup_atomic_batch_result diff --git a/src/proto_alpha/lib_parameters/default_parameters.ml b/src/proto_alpha/lib_parameters/default_parameters.ml index a4bd4ec2fe0186ba3518c5e03588d9a7481944e2..44531626217d1ff9de388fd6b74859b15ca73c88 100644 --- a/src/proto_alpha/lib_parameters/default_parameters.ml +++ b/src/proto_alpha/lib_parameters/default_parameters.ml @@ -188,7 +188,7 @@ let constants_mainnet = sc_rollup_max_available_messages = 1_000_000; (* TODO: https://gitlab.com/tezos/tezos/-/issues/2756 The following constants need to be refined. *) - sc_rollup_stake_amount_in_mutez = 32_000_000; + sc_rollup_stake_amount = Tez.of_mutez_exn 32_000_000L; sc_rollup_commitment_period_in_blocks = 30; sc_rollup_commitment_storage_size_in_bytes = 84; sc_rollup_max_lookahead_in_blocks = 30_000l; diff --git a/src/proto_alpha/lib_protocol/alpha_context.ml b/src/proto_alpha/lib_protocol/alpha_context.ml index 3873a278dc7dc4bb669259811f0b23cf0d9422e6..24bed7a7eaa822c86f327c2a3251b87474f57b4f 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.ml +++ b/src/proto_alpha/lib_protocol/alpha_context.ml @@ -51,6 +51,7 @@ module Timestamp = struct end module Slot = Slot_repr +module Sc_rollup_repr = Sc_rollup_repr module Sc_rollup = struct module Tick = Sc_rollup_tick_repr diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 1875b2ef4cc25c915ca2d647e8a82aae4edfc34f..a63f10edef248a0cc84566f65007352057a8e2bb 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -788,7 +788,7 @@ module Constants : sig sc_rollup_origination_size : int; sc_rollup_challenge_window_in_blocks : int; sc_rollup_max_available_messages : int; - sc_rollup_stake_amount_in_mutez : int; + sc_rollup_stake_amount : Tez.t; sc_rollup_commitment_period_in_blocks : int; sc_rollup_commitment_storage_size_in_bytes : int; sc_rollup_max_lookahead_in_blocks : int32; @@ -910,7 +910,7 @@ module Constants : sig val sc_rollup_max_available_messages : context -> int - val sc_rollup_stake_amount_in_mutez : Raw_context.t -> int + val sc_rollup_stake_amount : Raw_context.t -> Tez.t val sc_rollup_commitment_period_in_blocks : Raw_context.t -> int @@ -2137,8 +2137,20 @@ module Tx_rollup_errors : sig [`Inbox | `Commitment] -> int -> count_limit:int -> unit tzresult end +(** This is a forward declaration to avoid circular dependencies. + Use module [Sc_rollup] instead whenever possible. + TODO : find a better way to resolve the circular dependency + https://gitlab.com/tezos/tezos/-/issues/3147 *) +module Sc_rollup_repr : sig + module Address : S.HASH + + type t = Address.t +end + module Bond_id : sig - type t = Tx_rollup_bond_id of Tx_rollup.t + type t = + | Tx_rollup_bond_id of Tx_rollup.t + | Sc_rollup_bond_id of Sc_rollup_repr.t val pp : Format.formatter -> t -> unit @@ -2178,6 +2190,7 @@ module Receipt : sig | Frozen_bonds of Contract.t * Bond_id.t | Tx_rollup_rejection_punishments | Tx_rollup_rejection_rewards + | Sc_rollup_refutation_punishments val compare_balance : balance -> balance -> int @@ -2460,9 +2473,9 @@ module Sc_rollup : sig module Map : Map.S with type key = t end - module Address : S.HASH + module Address = Sc_rollup_repr.Address - type t = Address.t + type t = Sc_rollup_repr.t type rollup := t @@ -2670,7 +2683,9 @@ module Sc_rollup : sig t -> Staker.t -> Commitment.t -> - (Commitment.Hash.t * Raw_level.t * context) tzresult Lwt.t + (Commitment.Hash.t * Raw_level.t * context * Receipt.balance_updates) + tzresult + Lwt.t val cement_commitment : context -> t -> Commitment.Hash.t -> context tzresult Lwt.t @@ -2698,7 +2713,7 @@ module Sc_rollup : sig t -> Staker.t * Staker.t -> Game.outcome -> - (Game.status * context) tzresult Lwt.t + (Game.status * context * Receipt.balance_updates) tzresult Lwt.t end val rpc_arg : t RPC_arg.t @@ -3687,6 +3702,7 @@ module Token : sig | `Lost_endorsing_rewards of Signature.Public_key_hash.t * bool * bool | `Burned | `Tx_rollup_rejection_punishments + | `Sc_rollup_refutation_punishments | container ] val allocated : context -> container -> (context * bool) tzresult Lwt.t diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index d83197a7372c0ddfd2ca09909203fb3066241906..19c506c4856dbc554e505f7eb60c91fcc8a4a28e 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1764,10 +1764,11 @@ let apply_external_manager_operation_content : return (ctxt, result, []) | Sc_rollup_publish {rollup; commitment} -> Sc_rollup.Stake_storage.publish_commitment ctxt rollup source commitment - >>=? fun (staked_hash, published_at_level, ctxt) -> + >>=? fun (staked_hash, published_at_level, ctxt, balance_updates) -> let consumed_gas = Gas.consumed ~since:before_operation ~until:ctxt in let result = - Sc_rollup_publish_result {staked_hash; consumed_gas; published_at_level} + Sc_rollup_publish_result + {staked_hash; consumed_gas; published_at_level; balance_updates} in return (ctxt, result, []) | Sc_rollup_refute {rollup; opponent; refutation} -> @@ -1779,24 +1780,28 @@ let apply_external_manager_operation_content : refutation >>=? fun (outcome, ctxt) -> (match outcome with - | None -> return (Sc_rollup.Game.Ongoing, ctxt) + | None -> return (Sc_rollup.Game.Ongoing, ctxt, []) | Some o -> Sc_rollup.Refutation_storage.apply_outcome ctxt rollup (source, opponent) o) - >>=? fun (status, ctxt) -> + >>=? fun (status, ctxt, balance_updates) -> let consumed_gas = Gas.consumed ~since:before_operation ~until:ctxt in - let result = Sc_rollup_refute_result {status; consumed_gas} in + let result = + Sc_rollup_refute_result {status; consumed_gas; balance_updates} + in return (ctxt, result, []) | Sc_rollup_timeout {rollup; stakers} -> Sc_rollup.Refutation_storage.timeout ctxt rollup stakers >>=? fun (outcome, ctxt) -> Sc_rollup.Refutation_storage.apply_outcome ctxt rollup stakers outcome - >>=? fun (status, ctxt) -> + >>=? fun (status, ctxt, balance_updates) -> let consumed_gas = Gas.consumed ~since:before_operation ~until:ctxt in - let result = Sc_rollup_timeout_result {status; consumed_gas} in + let result = + Sc_rollup_timeout_result {status; consumed_gas; balance_updates} + in return (ctxt, result, []) | Sc_rollup_atomic_batch { diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index 01a3b1816e70054a298aa85e709451873c77c344..401d1393c0105db11110f15a78406c8601bf9ec3 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -237,16 +237,19 @@ type _ successful_manager_operation_result = consumed_gas : Gas.Arith.fp; staked_hash : Sc_rollup.Commitment.Hash.t; published_at_level : Raw_level.t; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_publish successful_manager_operation_result | Sc_rollup_refute_result : { consumed_gas : Gas.Arith.fp; status : Sc_rollup.Game.status; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_refute successful_manager_operation_result | Sc_rollup_timeout_result : { consumed_gas : Gas.Arith.fp; status : Sc_rollup.Game.status; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_timeout successful_manager_operation_result | Sc_rollup_atomic_batch_result : { @@ -987,68 +990,83 @@ module Manager_result = struct make ~op_case:Operation.Encoding.Manager_operations.sc_rollup_publish_case ~encoding: - (obj4 + (obj5 (req "consumed_gas" Gas.Arith.n_integral_encoding) (dft "consumed_milligas" Gas.Arith.n_fp_encoding Gas.Arith.zero) (req "staked_hash" Sc_rollup.Commitment.Hash.encoding) - (req "published_at_level" Raw_level.encoding)) + (req "published_at_level" Raw_level.encoding) + (req "balance_updates" Receipt.balance_updates_encoding)) ~select:(function | Successful_manager_result (Sc_rollup_publish_result _ as op) -> Some op | _ -> None) ~proj:(function | Sc_rollup_publish_result - {consumed_gas; staked_hash; published_at_level} -> + {consumed_gas; staked_hash; published_at_level; balance_updates} -> ( Gas.Arith.ceil consumed_gas, consumed_gas, staked_hash, - published_at_level )) + published_at_level, + balance_updates )) ~kind:Kind.Sc_rollup_publish_manager_kind ~inj: - (fun (consumed_gas, consumed_milligas, staked_hash, published_at_level) -> + (fun ( consumed_gas, + consumed_milligas, + staked_hash, + published_at_level, + balance_updates ) -> assert (Gas.Arith.(equal (ceil consumed_milligas) consumed_gas)) ; Sc_rollup_publish_result - {consumed_gas = consumed_milligas; staked_hash; published_at_level}) + { + consumed_gas = consumed_milligas; + staked_hash; + published_at_level; + balance_updates; + }) let sc_rollup_refute_case = make ~op_case:Operation.Encoding.Manager_operations.sc_rollup_refute_case ~encoding: Data_encoding.( - obj3 + obj4 (req "consumed_gas" Gas.Arith.n_integral_encoding) (dft "consumed_milligas" Gas.Arith.n_fp_encoding Gas.Arith.zero) - (req "status" Sc_rollup.Game.status_encoding)) + (req "status" Sc_rollup.Game.status_encoding) + (req "balance_updates" Receipt.balance_updates_encoding)) ~select:(function | Successful_manager_result (Sc_rollup_refute_result _ as op) -> Some op | _ -> None) ~proj:(function - | Sc_rollup_refute_result {consumed_gas; status} -> - (Gas.Arith.ceil consumed_gas, consumed_gas, status)) + | Sc_rollup_refute_result {consumed_gas; status; balance_updates} -> + (Gas.Arith.ceil consumed_gas, consumed_gas, status, balance_updates)) ~kind:Kind.Sc_rollup_refute_manager_kind - ~inj:(fun (consumed_gas, consumed_milligas, status) -> + ~inj:(fun (consumed_gas, consumed_milligas, status, balance_updates) -> assert (Gas.Arith.(equal (ceil consumed_milligas) consumed_gas)) ; - Sc_rollup_refute_result {consumed_gas = consumed_milligas; status}) + Sc_rollup_refute_result + {consumed_gas = consumed_milligas; status; balance_updates}) let sc_rollup_timeout_case = make ~op_case:Operation.Encoding.Manager_operations.sc_rollup_timeout_case ~encoding: - (obj3 + (obj4 (req "consumed_gas" Gas.Arith.n_integral_encoding) (dft "consumed_milligas" Gas.Arith.n_fp_encoding Gas.Arith.zero) - (req "status" Sc_rollup.Game.status_encoding)) + (req "status" Sc_rollup.Game.status_encoding) + (req "balance_updates" Receipt.balance_updates_encoding)) ~select:(function | Successful_manager_result (Sc_rollup_timeout_result _ as op) -> Some op | _ -> None) ~proj:(function - | Sc_rollup_timeout_result {consumed_gas; status} -> - (Gas.Arith.ceil consumed_gas, consumed_gas, status)) + | Sc_rollup_timeout_result {consumed_gas; status; balance_updates} -> + (Gas.Arith.ceil consumed_gas, consumed_gas, status, balance_updates)) ~kind:Kind.Sc_rollup_timeout_manager_kind - ~inj:(fun (consumed_gas, consumed_milligas, status) -> + ~inj:(fun (consumed_gas, consumed_milligas, status, balance_updates) -> assert (Gas.Arith.(equal (ceil consumed_milligas) consumed_gas)) ; - Sc_rollup_timeout_result {consumed_gas = consumed_milligas; status}) + Sc_rollup_timeout_result + {consumed_gas = consumed_milligas; status; balance_updates}) let sc_rollup_atomic_batch_case = make diff --git a/src/proto_alpha/lib_protocol/apply_results.mli b/src/proto_alpha/lib_protocol/apply_results.mli index 508d90b0a5102745204e2a6cc90582318c1f95c5..efd00ffc6bd6e4e4f2b50ebaa9978fafef353605 100644 --- a/src/proto_alpha/lib_protocol/apply_results.mli +++ b/src/proto_alpha/lib_protocol/apply_results.mli @@ -284,16 +284,19 @@ and _ successful_manager_operation_result = consumed_gas : Gas.Arith.fp; staked_hash : Sc_rollup.Commitment.Hash.t; published_at_level : Raw_level.t; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_publish successful_manager_operation_result | Sc_rollup_refute_result : { consumed_gas : Gas.Arith.fp; status : Sc_rollup.Game.status; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_refute successful_manager_operation_result | Sc_rollup_timeout_result : { consumed_gas : Gas.Arith.fp; status : Sc_rollup.Game.status; + balance_updates : Receipt.balance_updates; } -> Kind.sc_rollup_timeout successful_manager_operation_result | Sc_rollup_atomic_batch_result : { diff --git a/src/proto_alpha/lib_protocol/bond_id_repr.ml b/src/proto_alpha/lib_protocol/bond_id_repr.ml index 4ac94a058071a488dce3683c61614358f453bcc0..665d0e64d5bfd84534b339dbe8d8fac0936a5346 100644 --- a/src/proto_alpha/lib_protocol/bond_id_repr.ml +++ b/src/proto_alpha/lib_protocol/bond_id_repr.ml @@ -23,7 +23,9 @@ (* *) (*****************************************************************************) -type t = Tx_rollup_bond_id of Tx_rollup_repr.t +type t = + | Tx_rollup_bond_id of Tx_rollup_repr.t + | Sc_rollup_bond_id of Sc_rollup_repr.t include Compare.Make (struct type nonrec t = t @@ -32,6 +34,10 @@ include Compare.Make (struct match (id1, id2) with | Tx_rollup_bond_id id1, Tx_rollup_bond_id id2 -> Tx_rollup_repr.compare id1 id2 + | Sc_rollup_bond_id id1, Sc_rollup_bond_id id2 -> + Sc_rollup_repr.Address.compare id1 id2 + | Tx_rollup_bond_id _, Sc_rollup_bond_id _ -> -1 + | Sc_rollup_bond_id _, Tx_rollup_bond_id _ -> 1 end) let encoding = @@ -43,18 +49,47 @@ let encoding = (Tag 0) ~title:"Tx_rollup_bond_id" (obj1 (req "tx_rollup" Tx_rollup_repr.encoding)) - (function Tx_rollup_bond_id id -> Some id) + (function Tx_rollup_bond_id id -> Some id | _ -> None) (fun id -> Tx_rollup_bond_id id); + case + (Tag 1) + ~title:"Sc_rollup_bond_id" + (obj1 (req "sc_rollup" Sc_rollup_repr.encoding)) + (function Sc_rollup_bond_id id -> Some id | _ -> None) + (fun id -> Sc_rollup_bond_id id); ] -let pp ppf (Tx_rollup_bond_id id) = Tx_rollup_repr.pp ppf id +let pp ppf = function + | Tx_rollup_bond_id id -> Tx_rollup_repr.pp ppf id + | Sc_rollup_bond_id id -> Sc_rollup_repr.pp ppf id let rpc_arg = - let construct (Tx_rollup_bond_id id) = Tx_rollup_repr.to_b58check id in + let construct = function + | Tx_rollup_bond_id id -> Tx_rollup_repr.to_b58check id + | Sc_rollup_bond_id id -> Sc_rollup_repr.Address.to_b58check id + in let destruct id = - Result.map_error - (fun _ -> "Cannot parse tx rollup id") - (Tx_rollup_repr.of_b58check id >>? fun id -> ok (Tx_rollup_bond_id id)) + (* String.starts_with from the stdlib 4.14, with [unsafe_get] replaced by + [get], comparators replaced by theirs versions in [Compare.*]. *) + let starts_with ~prefix s = + let open String in + let len_s = length s and len_pre = length prefix in + let rec aux i = + if Compare.Int.(i = len_pre) then true + else if Compare.Char.(get s i <> get prefix i) then false + else aux (i + 1) + in + Compare.Int.(len_s >= len_pre) && aux 0 + in + if starts_with ~prefix:Tx_rollup_repr.Hash.rollup_hash id then + match Tx_rollup_repr.of_b58check_opt id with + | Some id -> Result.ok (Tx_rollup_bond_id id) + | None -> Result.error "Cannot parse transaction rollup id" + else if starts_with ~prefix:Sc_rollup_repr.Address.prefix id then + match Sc_rollup_repr.Address.of_b58check_opt id with + | Some id -> Result.ok (Sc_rollup_bond_id id) + | None -> Result.error "Cannot parse smart contract rollup id" + else Result.error "Cannot parse rollup id" in RPC_arg.make ~descr:"A bond identifier." diff --git a/src/proto_alpha/lib_protocol/bond_id_repr.mli b/src/proto_alpha/lib_protocol/bond_id_repr.mli index 82d45ef41f2fbb8b4266359219d0da941821d6fb..b9e8089cace84d1b722cbd0751f5fef46d2b978e 100644 --- a/src/proto_alpha/lib_protocol/bond_id_repr.mli +++ b/src/proto_alpha/lib_protocol/bond_id_repr.mli @@ -25,7 +25,9 @@ (** This module defines identifiers for frozen bonds. *) -type t = Tx_rollup_bond_id of Tx_rollup_repr.t +type t = + | Tx_rollup_bond_id of Tx_rollup_repr.t + | Sc_rollup_bond_id of Sc_rollup_repr.t val pp : Format.formatter -> t -> unit diff --git a/src/proto_alpha/lib_protocol/constants_parametric_repr.ml b/src/proto_alpha/lib_protocol/constants_parametric_repr.ml index 791c6905d5e92443bc722ff4381dff59a97b1a02..96086463d219aebc53b166bd82bc925066249efb 100644 --- a/src/proto_alpha/lib_protocol/constants_parametric_repr.ml +++ b/src/proto_alpha/lib_protocol/constants_parametric_repr.ml @@ -134,7 +134,7 @@ type t = { sc_rollup_origination_size : int; sc_rollup_challenge_window_in_blocks : int; sc_rollup_max_available_messages : int; - sc_rollup_stake_amount_in_mutez : int; + sc_rollup_stake_amount : Tez_repr.t; sc_rollup_commitment_period_in_blocks : int; sc_rollup_commitment_storage_size_in_bytes : int; sc_rollup_max_lookahead_in_blocks : int32; @@ -202,7 +202,7 @@ let encoding = c.sc_rollup_origination_size, c.sc_rollup_challenge_window_in_blocks, c.sc_rollup_max_available_messages, - c.sc_rollup_stake_amount_in_mutez, + c.sc_rollup_stake_amount, c.sc_rollup_commitment_period_in_blocks, c.sc_rollup_commitment_storage_size_in_bytes, c.sc_rollup_max_lookahead_in_blocks, @@ -264,7 +264,7 @@ let encoding = sc_rollup_origination_size, sc_rollup_challenge_window_in_blocks, sc_rollup_max_available_messages, - sc_rollup_stake_amount_in_mutez, + sc_rollup_stake_amount, sc_rollup_commitment_period_in_blocks, sc_rollup_commitment_storage_size_in_bytes, sc_rollup_max_lookahead_in_blocks, @@ -328,7 +328,7 @@ let encoding = sc_rollup_origination_size; sc_rollup_challenge_window_in_blocks; sc_rollup_max_available_messages; - sc_rollup_stake_amount_in_mutez; + sc_rollup_stake_amount; sc_rollup_commitment_period_in_blocks; sc_rollup_commitment_storage_size_in_bytes; sc_rollup_max_lookahead_in_blocks; @@ -413,7 +413,7 @@ let encoding = (req "sc_rollup_origination_size" int31) (req "sc_rollup_challenge_window_in_blocks" int31) (req "sc_rollup_max_available_messages" int31) - (req "sc_rollup_stake_amount_in_mutez" int31) + (req "sc_rollup_stake_amount" Tez_repr.encoding) (req "sc_rollup_commitment_period_in_blocks" int31) (req "sc_rollup_commitment_storage_size_in_bytes" diff --git a/src/proto_alpha/lib_protocol/constants_parametric_repr.mli b/src/proto_alpha/lib_protocol/constants_parametric_repr.mli index 3f362bfdd07dea855979a2b2053877faf9f0937b..2af7fc0673ce7beb274f93894192c96b69ebc13c 100644 --- a/src/proto_alpha/lib_protocol/constants_parametric_repr.mli +++ b/src/proto_alpha/lib_protocol/constants_parametric_repr.mli @@ -131,7 +131,7 @@ type t = { sc_rollup_origination_size : int; sc_rollup_challenge_window_in_blocks : int; sc_rollup_max_available_messages : int; - sc_rollup_stake_amount_in_mutez : int; + sc_rollup_stake_amount : Tez_repr.t; (* The period with which commitments are made. *) sc_rollup_commitment_period_in_blocks : int; (* The storage size requirement (in bytes) of a commitment *) diff --git a/src/proto_alpha/lib_protocol/constants_storage.ml b/src/proto_alpha/lib_protocol/constants_storage.ml index a6bb076a484435c31cdabfcca48bdd64e142f343..753ac3c3479d58960a9253bed5ba42faf00294e5 100644 --- a/src/proto_alpha/lib_protocol/constants_storage.ml +++ b/src/proto_alpha/lib_protocol/constants_storage.ml @@ -226,9 +226,9 @@ let sc_rollup_max_available_messages c = let constants = Raw_context.constants c in constants.sc_rollup_max_available_messages -let sc_rollup_stake_amount_in_mutez c = +let sc_rollup_stake_amount c = let constants = Raw_context.constants c in - constants.sc_rollup_stake_amount_in_mutez + constants.sc_rollup_stake_amount let sc_rollup_commitment_period_in_blocks c = let constants = Raw_context.constants c in diff --git a/src/proto_alpha/lib_protocol/constants_storage.mli b/src/proto_alpha/lib_protocol/constants_storage.mli index bcabda7717f0e58265fe98c72632b14bc03deecb..9f0a9c5a8ebce0b4f95c1b874aa7c91d539e1f18 100644 --- a/src/proto_alpha/lib_protocol/constants_storage.mli +++ b/src/proto_alpha/lib_protocol/constants_storage.mli @@ -133,7 +133,7 @@ val sc_rollup_challenge_window_in_blocks : Raw_context.t -> int val sc_rollup_max_available_messages : Raw_context.t -> int -val sc_rollup_stake_amount_in_mutez : Raw_context.t -> int +val sc_rollup_stake_amount : Raw_context.t -> Tez_repr.t val sc_rollup_commitment_period_in_blocks : Raw_context.t -> int diff --git a/src/proto_alpha/lib_protocol/raw_context.ml b/src/proto_alpha/lib_protocol/raw_context.ml index 52ed71a62c96aa94123476b66ab42941d8a86dac..af2b11748ce8bf36a933384bf56acc0dad520ff6 100644 --- a/src/proto_alpha/lib_protocol/raw_context.ml +++ b/src/proto_alpha/lib_protocol/raw_context.ml @@ -991,7 +991,7 @@ let prepare_first_block ~level ~timestamp ctxt = sc_rollup_max_available_messages = 1_000_000; (* TODO: https://gitlab.com/tezos/tezos/-/issues/2756 The following constants need to be refined. *) - sc_rollup_stake_amount_in_mutez = 32_000_000; + sc_rollup_stake_amount = Tez_repr.of_mutez_exn 32_000_000L; sc_rollup_commitment_period_in_blocks = 30; (* 76 for Commitments entry + 4 for Commitment_stake_count entry + 4 for Commitment_added entry diff --git a/src/proto_alpha/lib_protocol/receipt_repr.ml b/src/proto_alpha/lib_protocol/receipt_repr.ml index 605962af8cc6e7513853a2c3458d156dbe198209..a0b66916ba46a2e14c0de54cc1acd431bb72f86e 100644 --- a/src/proto_alpha/lib_protocol/receipt_repr.ml +++ b/src/proto_alpha/lib_protocol/receipt_repr.ml @@ -46,6 +46,7 @@ type balance = | Frozen_bonds of Contract_repr.t * Bond_id_repr.t | Tx_rollup_rejection_punishments | Tx_rollup_rejection_rewards + | Sc_rollup_refutation_punishments let balance_encoding = let open Data_encoding in @@ -231,6 +232,15 @@ let balance_encoding = (function | Tx_rollup_rejection_punishments -> Some ((), ()) | _ -> None) (fun ((), ()) -> Tx_rollup_rejection_punishments); + case + (Tag 24) + ~title:"Sc_rollup_refutation_punishments" + (obj2 + (req "kind" (constant "burned")) + (req "category" (constant "sc_rollup_refutation_punishments"))) + (function + | Sc_rollup_refutation_punishments -> Some ((), ()) | _ -> None) + (fun ((), ()) -> Sc_rollup_refutation_punishments); ] let is_not_zero c = not (Compare.Int.equal c 0) @@ -275,6 +285,7 @@ let compare_balance ba bb = | Frozen_bonds _ -> 18 | Tx_rollup_rejection_punishments -> 19 | Tx_rollup_rejection_rewards -> 20 + | Sc_rollup_refutation_punishments -> 21 (* don't forget to add parameterized cases in the first part of the function *) in Compare.Int.compare (index ba) (index bb) diff --git a/src/proto_alpha/lib_protocol/receipt_repr.mli b/src/proto_alpha/lib_protocol/receipt_repr.mli index b3aaa1adc85e66d39495dd496af6a30fb66b01af..aba8195d40f4f5950abfcb34bf13ba96b2e8cc72 100644 --- a/src/proto_alpha/lib_protocol/receipt_repr.mli +++ b/src/proto_alpha/lib_protocol/receipt_repr.mli @@ -47,6 +47,7 @@ type balance = | Frozen_bonds of Contract_repr.t * Bond_id_repr.t | Tx_rollup_rejection_punishments | Tx_rollup_rejection_rewards + | Sc_rollup_refutation_punishments (** Compares two balances. *) val compare_balance : balance -> balance -> int diff --git a/src/proto_alpha/lib_protocol/sc_rollup_errors.ml b/src/proto_alpha/lib_protocol/sc_rollup_errors.ml index e07643d89171e51d06ec7d060aff8ddc2f902141..61bae4116c434ef4bee245356100b98699b20a1b 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_errors.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_errors.ml @@ -50,6 +50,13 @@ type error += | (* `Temporary *) Sc_rollup_invalid_outbox_message_index | (* `Temporary *) Sc_rollup_outbox_level_expired | (* `Temporary *) Sc_rollup_outbox_message_already_applied + | (* `Temporary *) + Sc_rollup_staker_funds_too_low of { + staker : Signature.public_key_hash; + sc_rollup : Sc_rollup_repr.t; + staker_balance : Tez_repr.t; + min_expected_balance : Tez_repr.t; + } let () = register_error_kind @@ -278,4 +285,39 @@ let () = Data_encoding.empty (function Sc_rollup_outbox_message_already_applied -> Some () | _ -> None) (fun () -> Sc_rollup_outbox_message_already_applied) ; + register_error_kind + `Temporary + ~id:"Sc_rollup_staker_funds_too_low" + ~title:"Staker does not have enough funds to make a deposit" + ~description: + "Staker doesn't have enough funds to make a smart contract rollup \ + deposit." + ~pp:(fun ppf (staker, sc_rollup, staker_balance, min_expected_balance) -> + Format.fprintf + ppf + "Staker (%a) doesn't have enough funds to make the deposit for smart \ + contract rollup (%a). Staker's balance is %a while a balance of at \ + least %a is required." + Signature.Public_key_hash.pp + staker + Sc_rollup_repr.pp + sc_rollup + Tez_repr.pp + staker_balance + Tez_repr.pp + min_expected_balance) + Data_encoding.( + obj4 + (req "staker" Signature.Public_key_hash.encoding) + (req "sc_rollup" Sc_rollup_repr.encoding) + (req "staker_balance" Tez_repr.encoding) + (req "min_expected_balance" Tez_repr.encoding)) + (function + | Sc_rollup_staker_funds_too_low + {staker; sc_rollup; staker_balance; min_expected_balance} -> + Some (staker, sc_rollup, staker_balance, min_expected_balance) + | _ -> None) + (fun (staker, sc_rollup, staker_balance, min_expected_balance) -> + Sc_rollup_staker_funds_too_low + {staker; sc_rollup; staker_balance; min_expected_balance}) ; () diff --git a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml index ccf330c77a40ca2ccf3a2cc7531c7f327bd25e94..d99a038a5c402760aa97909cc0475f45180d3a11 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.ml @@ -250,12 +250,17 @@ let apply_outcome ctxt rollup stakers (outcome : Sc_rollup_game_repr.outcome) = let open Lwt_tzresult_syntax in let alice, bob = Sc_rollup_game_repr.Index.normalize stakers in let losing_staker = Sc_rollup_game_repr.Index.staker stakers outcome.loser in - let* ctxt = Stake_storage.remove_staker ctxt rollup losing_staker in + let* ctxt, balance_updates = + Stake_storage.remove_staker ctxt rollup losing_staker + in let* ctxt, _, _ = Store.Game.remove (ctxt, rollup) (alice, bob) in let* ctxt, _, _ = Store.Game_timeout.remove (ctxt, rollup) (alice, bob) in let* ctxt, _, _ = Store.Opponent.remove (ctxt, rollup) alice in let* ctxt, _, _ = Store.Opponent.remove (ctxt, rollup) bob in - return (Sc_rollup_game_repr.Ended (outcome.reason, losing_staker), ctxt) + return + ( Sc_rollup_game_repr.Ended (outcome.reason, losing_staker), + ctxt, + balance_updates ) module Internal_for_tests = struct let get_conflict_point = get_conflict_point diff --git a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.mli b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.mli index d5f2563a8caedb55569bc54fc5d2895a34b2706d..d0cb532463ef0d2cb42938da35c87597ba951aae 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_refutation_storage.mli @@ -110,7 +110,9 @@ val apply_outcome : Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t * Sc_rollup_repr.Staker.t -> Sc_rollup_game_repr.outcome -> - (Sc_rollup_game_repr.status * Raw_context.t) tzresult Lwt.t + (Sc_rollup_game_repr.status * Raw_context.t * Receipt_repr.balance_updates) + tzresult + Lwt.t (**/**) diff --git a/src/proto_alpha/lib_protocol/sc_rollup_repr.mli b/src/proto_alpha/lib_protocol/sc_rollup_repr.mli index b198a7c43e73d7432718e9962f27c051610d37fd..a73288a4df73e89f261f07606a2340ccbdad3bab 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_repr.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_repr.mli @@ -52,6 +52,9 @@ module Address : sig val encoded_size : int val of_b58data : Base58.data -> t option + + (** [prefix] is the prefix of smart contract rollup addresses. *) + val prefix : string end module Internal_for_tests : sig diff --git a/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.ml b/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.ml index 03baddb4e56c5876a43c16f3f29ceb3cb3d922f2..1e9edfa2f686275eb22746065b5884d1b12540d7 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.ml @@ -47,17 +47,40 @@ let modify_staker_count ctxt rollup f = assert (Compare.Int.(size_diff = 0)) ; return ctxt +let get_contract_and_stake ctxt staker = + let staker_contract = Contract_repr.Implicit staker in + let stake = Constants_storage.sc_rollup_stake_amount ctxt in + (staker_contract, stake) + (** Warning: must be called only if [rollup] exists and [staker] is not to be found in {!Store.Stakers.} *) let deposit_stake ctxt rollup staker = let open Lwt_tzresult_syntax in let* lcc, ctxt = Commitment_storage.last_cemented_commitment ctxt rollup in - (* TODO: https://gitlab.com/tezos/tezos/-/issues/2449 - We should lock stake here, and fail if there aren't enough funds. - *) + let staker_contract, stake = get_contract_and_stake ctxt staker in + let* ctxt, staker_balance = Token.balance ctxt (`Contract staker_contract) in + let* () = + fail_when + Tez_repr.(staker_balance < stake) + (Sc_rollup_staker_funds_too_low + { + staker; + sc_rollup = rollup; + staker_balance; + min_expected_balance = stake; + }) + in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let* ctxt, balance_updates = + Token.transfer + ctxt + (`Contract staker_contract) + (`Frozen_bonds (staker_contract, bond_id)) + stake + in let* ctxt, _size = Store.Stakers.init (ctxt, rollup) staker lcc in let* ctxt = modify_staker_count ctxt rollup Int32.succ in - return ctxt + return (ctxt, balance_updates) let withdraw_stake ctxt rollup staker = let open Lwt_tzresult_syntax in @@ -71,13 +94,20 @@ let withdraw_stake ctxt rollup staker = Commitment_hash.(staked_on_commitment = lcc) Sc_rollup_not_staked_on_lcc in - (* TODO: https://gitlab.com/tezos/tezos/-/issues/2449 - We should refund stake here. - *) + let staker_contract, stake = get_contract_and_stake ctxt staker in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let* ctxt, balance_updates = + Token.transfer + ctxt + (`Frozen_bonds (staker_contract, bond_id)) + (`Contract staker_contract) + stake + in let* ctxt, _size_freed = Store.Stakers.remove_existing (ctxt, rollup) staker in - modify_staker_count ctxt rollup Int32.pred + let+ ctxt = modify_staker_count ctxt rollup Int32.pred in + (ctxt, balance_updates) let assert_commitment_not_too_far_ahead ctxt rollup lcc commitment = let open Lwt_tzresult_syntax in @@ -267,8 +297,13 @@ let refine_stake ctxt rollup staker commitment = let publish_commitment ctxt rollup staker commitment = let open Lwt_tzresult_syntax in let* ctxt, res = Store.Stakers.mem (ctxt, rollup) staker in - let* ctxt = if res then return ctxt else deposit_stake ctxt rollup staker in - refine_stake ctxt rollup staker commitment + let* ctxt, balance_updates = + if res then return (ctxt, []) else deposit_stake ctxt rollup staker + in + let+ commitment_hash, ctxt, level = + refine_stake ctxt rollup staker commitment + in + (commitment_hash, ctxt, level, balance_updates) (** Try to consume n messages. *) let consume_n_messages ctxt rollup n = @@ -348,6 +383,15 @@ let remove_staker ctxt rollup staker = let* () = fail_when Commitment_hash.(staked_on = lcc) Sc_rollup_remove_lcc in + let staker_contract, stake = get_contract_and_stake ctxt staker in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let* ctxt, balance_updates = + Token.transfer + ctxt + (`Frozen_bonds (staker_contract, bond_id)) + `Sc_rollup_refutation_punishments + stake + in let* ctxt, _size_diff = Store.Stakers.remove_existing (ctxt, rollup) staker in @@ -361,7 +405,8 @@ let remove_staker ctxt rollup staker = let* ctxt = decrease_commitment_stake_count ctxt rollup node in (go [@ocaml.tailcall]) pred ctxt in - go staked_on ctxt + let+ ctxt = go staked_on ctxt in + (ctxt, balance_updates) module Internal_for_tests = struct let deposit_stake = deposit_stake diff --git a/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.mli b/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.mli index 19979776411b521168113853232a58ad8113e7d6..14859261eb13f164d109d76b0e4aeb485b24e995 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_stake_storage.mli @@ -41,7 +41,7 @@ val remove_staker : Raw_context.t -> Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> - Raw_context.t tzresult Lwt.t + (Raw_context.t * Receipt_repr.balance_updates) tzresult Lwt.t (** This is a wrapper around [deposit_stake] and [refine_stake] that deposits a stake and then refines it to the specified commitment, @@ -73,7 +73,11 @@ val publish_commitment : Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> Sc_rollup_commitment_repr.t -> - (Sc_rollup_commitment_repr.Hash.t * Raw_level_repr.t * Raw_context.t) tzresult + (Sc_rollup_commitment_repr.Hash.t + * Raw_level_repr.t + * Raw_context.t + * Receipt_repr.balance_updates) + tzresult Lwt.t (** [cement_commitment context rollup commitment] cements the given @@ -123,8 +127,8 @@ val find_staker : module Internal_for_tests : sig (** [deposit_stake context rollup staker] stakes [staker] at the last - cemented commitment, freezing [sc_rollup_deposit] from [staker]'s account - balance. + cemented commitment, freezing [sc_rollup_stake_amount] from [staker]'s + account balance. Warning: must be called only if [rollup] exists and [staker] is not to be found in {!Store.Stakers.} @@ -143,7 +147,7 @@ module Internal_for_tests : sig Raw_context.t -> Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> - Raw_context.t tzresult Lwt.t + (Raw_context.t * Receipt_repr.balance_updates) tzresult Lwt.t (** [withdraw_stake context rollup staker] removes [staker] and returns any deposit previously frozen by [deposit_stake]. @@ -167,7 +171,7 @@ module Internal_for_tests : sig Raw_context.t -> Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> - Raw_context.t tzresult Lwt.t + (Raw_context.t * Receipt_repr.balance_updates) tzresult Lwt.t (** [refine_stake context rollup staker commitment] moves the stake of [staker] to [commitment]. Because we do not assume any form of coordination diff --git a/src/proto_alpha/lib_protocol/test/integration/test_constants.ml b/src/proto_alpha/lib_protocol/test/integration/test_constants.ml index d5200d11094cc419797b59e0e4212266dd482d9f..9e98c26728012028996f9c802dcbed4c89988992 100644 --- a/src/proto_alpha/lib_protocol/test/integration/test_constants.ml +++ b/src/proto_alpha/lib_protocol/test/integration/test_constants.ml @@ -97,13 +97,15 @@ let test_sc_rollup_max_commitment_storage_cost_lt_deposit () = let commitment_period = Int64.of_int constants.sc_rollup_commitment_period_in_blocks in - let stake_amount = Int64.of_int constants.sc_rollup_stake_amount_in_mutez in + let stake_amount_in_mutez = + Alpha_context.Tez.to_mutez constants.sc_rollup_stake_amount + in Assert.leq_int64 ~loc:__LOC__ (Int64.mul commitment_storage_cost (Int64.div max_lookahead commitment_period)) - stake_amount + stake_amount_in_mutez (* Check that [sc_rollup_commitment_storage_size_in_bytes = commitments_entry_size + diff --git a/src/proto_alpha/lib_protocol/test/integration/test_token.ml b/src/proto_alpha/lib_protocol/test/integration/test_token.ml index d124511689198ad537a81a35befe187ddc2f17b5..4a05fb1a885e7d9e132c526f87c3b45bc7ec7193 100644 --- a/src/proto_alpha/lib_protocol/test/integration/test_token.ml +++ b/src/proto_alpha/lib_protocol/test/integration/test_token.ml @@ -266,6 +266,17 @@ let test_transferring_to_burned ctxt = (Lost_endorsing_rewards (pkh, p, r), Credited amount, Block_application); ]) true + >>=? fun () -> + wrap (Token.transfer ctxt `Minted `Sc_rollup_refutation_punishments amount) + >>=? fun (_, bupds) -> + Assert.equal_bool + ~loc:__LOC__ + (bupds + = [ + minted_bupd; + (Sc_rollup_refutation_punishments, Credited amount, Block_application); + ]) + true let test_transferring_to_frozen_bonds ctxt = let pkh, _pk, _sk = Signature.generate_key () in diff --git a/src/proto_alpha/lib_protocol/test/pbt/test_refutation_game.ml b/src/proto_alpha/lib_protocol/test/pbt/test_refutation_game.ml index 1dec44f739216b3a0b7c65001e0ddaae1170ae95..622c6715b6effe8a88c40c379759be6ec105e849 100644 --- a/src/proto_alpha/lib_protocol/test/pbt/test_refutation_game.ml +++ b/src/proto_alpha/lib_protocol/test/pbt/test_refutation_game.ml @@ -40,6 +40,7 @@ open Lwt_syntax exception TickNotFound of Sc_rollup_tick_repr.t open Lib_test.Qcheck_helpers +module Sc_rollup_repr = Protocol.Sc_rollup_repr (** diff --git a/src/proto_alpha/lib_protocol/test/unit/test_receipt.ml b/src/proto_alpha/lib_protocol/test/unit/test_receipt.ml index 962ebb06e2088b7783dc4e7ad20fac05a46dcbe2..49854e2054accc053ff87420245306e484ba5d53 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_receipt.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_receipt.ml @@ -95,6 +95,7 @@ let test_encodings () = let bond_id = Bond_id.Tx_rollup_bond_id tx_rollup in test_encodings (Frozen_bonds (Contract.Implicit pkh, bond_id)) >>=? fun () -> test_encodings Tx_rollup_rejection_punishments >>=? fun () -> - test_encodings Tx_rollup_rejection_rewards + test_encodings Tx_rollup_rejection_rewards >>=? fun () -> + test_encodings Sc_rollup_refutation_punishments let tests = Tztest.[tztest "receipt - encoding" `Quick test_encodings] diff --git a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_storage.ml b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_storage.ml index 23a2f3c68e051071766dde0402c21d167c275042..91b5c4471a552b44674753eeb4a4e5693eb49a8e 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_storage.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_sc_rollup_storage.ml @@ -39,14 +39,28 @@ module Commitment_repr = Sc_rollup_commitment_repr (** Lift a computation using using environment errors to use shell errors. *) let lift k = Lwt.map Environment.wrap_tzresult k +let initial_staker_balance = Tez_repr.of_mutez_exn 100_000_000_000L + let new_context () = let* b, _contract = Context.init1 () in - Incremental.begin_construction b >|=? fun inc -> + Incremental.begin_construction b >>=? fun inc -> let state = Incremental.validation_state inc in let ctxt = state.ctxt in (* Necessary to originate rollups. *) let ctxt = Alpha_context.Origination_nonce.init ctxt Operation_hash.zero in - Alpha_context.Internal_for_tests.to_raw ctxt + let ctxt = Alpha_context.Internal_for_tests.to_raw ctxt in + (* Mint some tez for staker accounts. *) + let mint_tez_for ctxt pkh_str = + let pkh = Signature.Public_key_hash.of_b58check_exn pkh_str in + let contract = Contract_repr.Implicit pkh in + let+ ctxt, _ = + lift + @@ Token.transfer ctxt `Minted (`Contract contract) initial_staker_balance + in + ctxt + in + let* ctxt = mint_tez_for ctxt "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in + mint_tez_for ctxt "tz1RikjCkrEde1QQmuesp796jCxeiyE6t3Vo" let new_sc_rollup ctxt = let+ rollup, _size, ctxt = @@ -62,6 +76,49 @@ let new_sc_rollup ctxt = in (rollup, ctxt) +let equal_tez ~loc = + Assert.equal ~loc Tez_repr.( = ) "Tez aren't equal" Tez_repr.pp + +let assert_balance_changed op ctxt ctxt' account amount = + let* _, balance = lift @@ Token.balance ctxt account in + let* _, balance' = lift @@ Token.balance ctxt' account in + let* balance_op_amount = lift @@ op balance amount in + equal_tez balance' ~loc:__LOC__ balance_op_amount + +let assert_balance_increased ctxt ctxt' account amount = + let ( +? ) t1 t2 = Lwt.return Tez_repr.(t1 +? t2) in + assert_balance_changed ( +? ) ctxt ctxt' account amount + +let assert_balance_decreased ctxt ctxt' account amount = + let ( -? ) t1 t2 = Lwt.return Tez_repr.(t1 -? t2) in + assert_balance_changed ( -? ) ctxt ctxt' account amount + +let perform_staking_action_and_check ctxt rollup staker do_and_check = + let staker_contract = Contract_repr.Implicit staker in + let stake = Constants_storage.sc_rollup_stake_amount ctxt in + do_and_check ctxt rollup staker_contract stake + +let deposit_stake_and_check_balances ctxt rollup staker = + perform_staking_action_and_check + ctxt + rollup + staker + (fun ctxt rollup staker_contract stake -> + let* ctxt', _ = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake + ctxt + rollup + staker + in + let* () = + assert_balance_decreased ctxt ctxt' (`Contract staker_contract) stake + in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let bonds_account = `Frozen_bonds (staker_contract, bond_id) in + let+ () = assert_balance_increased ctxt ctxt' bonds_account stake in + ctxt') + (** Originate a rollup with one staker and make a deposit to the initial LCC *) let originate_rollup_and_deposit_with_one_staker () = let* ctxt = new_context () in @@ -69,13 +126,7 @@ let originate_rollup_and_deposit_with_one_staker () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let+ ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let+ ctxt = deposit_stake_and_check_balances ctxt rollup staker in (ctxt, rollup, staker) (** Originate a rollup with two stakers and make a deposit to the initial LCC *) @@ -88,20 +139,8 @@ let originate_rollup_and_deposit_with_two_stakers () = let staker2 = Sc_rollup_repr.Staker.of_b58check_exn "tz1RikjCkrEde1QQmuesp796jCxeiyE6t3Vo" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker1 - in - let+ ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker2 - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker1 in + let+ ctxt = deposit_stake_and_check_balances ctxt rollup staker2 in (ctxt, rollup, staker1, staker2) (** Trivial assertion. @@ -157,6 +196,43 @@ let test_deposit_to_missing_rollup () = rollup Sc_rollup_repr.Staker.zero) +let test_deposit_by_underfunded_staker () = + let* ctxt = new_context () in + let* sc_rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Sc_rollup_repr.Staker.of_b58check_exn "tz1hhNZvjed6McQQLWtR7MRzPHpgSFZTXxdW" + in + let stake = Constants_storage.sc_rollup_stake_amount ctxt in + let* () = + assert_fails_with + ~loc:__LOC__ + (Sc_rollup_stake_storage.Internal_for_tests.deposit_stake + ctxt + sc_rollup + staker) + (Sc_rollup_errors.Sc_rollup_staker_funds_too_low + { + staker; + sc_rollup; + staker_balance = Tez_repr.zero; + min_expected_balance = stake; + }) + in + let staker_balance = Tez_repr.div_exn stake 2 in + let staker_contract = Contract_repr.Implicit staker in + let* ctxt, _ = + lift + @@ Token.transfer ctxt `Minted (`Contract staker_contract) staker_balance + in + assert_fails_with + ~loc:__LOC__ + (Sc_rollup_stake_storage.Internal_for_tests.deposit_stake + ctxt + sc_rollup + staker) + (Sc_rollup_errors.Sc_rollup_staker_funds_too_low + {staker; sc_rollup; staker_balance; min_expected_balance = stake}) + let test_initial_state_is_pre_boot () = let* ctxt = new_context () in let* rollup, ctxt = lift @@ new_sc_rollup ctxt in @@ -167,19 +243,35 @@ let test_initial_state_is_pre_boot () = let test_deposit_to_existing_rollup () = let* ctxt = new_context () in - lift - @@ let* rollup, ctxt = new_sc_rollup ctxt in - let staker = - Signature.Public_key_hash.of_b58check_exn - "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - assert_true ctxt + let* rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Signature.Public_key_hash.of_b58check_exn + "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" + in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + assert_true ctxt + +let assert_balance_unchanged ctxt ctxt' account = + let* _, balance = lift @@ Token.balance ctxt account in + let* _, balance' = lift @@ Token.balance ctxt' account in + equal_tez ~loc:__LOC__ balance' balance + +let remove_staker_and_check_balances ctxt rollup staker = + perform_staking_action_and_check + ctxt + rollup + staker + (fun ctxt rollup staker_contract stake -> + let* ctxt', _ = + lift @@ Sc_rollup_stake_storage.remove_staker ctxt rollup staker + in + let* () = + assert_balance_unchanged ctxt ctxt' (`Contract staker_contract) + in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let bonds_account = `Frozen_bonds (staker_contract, bond_id) in + let+ () = assert_balance_decreased ctxt ctxt' bonds_account stake in + ctxt') let test_removing_staker_from_lcc_fails () = let* ctxt = new_context () in @@ -188,39 +280,43 @@ let test_removing_staker_from_lcc_fails () = Signature.Public_key_hash.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in assert_fails_with ~loc:__LOC__ (Sc_rollup_stake_storage.remove_staker ctxt rollup staker) Sc_rollup_errors.Sc_rollup_remove_lcc +let withdraw_stake_and_check_balances ctxt rollup staker = + perform_staking_action_and_check + ctxt + rollup + staker + (fun ctxt rollup staker_contract stake -> + let* ctxt', _ = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.withdraw_stake + ctxt + rollup + staker + in + let* () = + assert_balance_increased ctxt ctxt' (`Contract staker_contract) stake + in + let bond_id = Bond_id_repr.Sc_rollup_bond_id rollup in + let bonds_account = `Frozen_bonds (staker_contract, bond_id) in + let+ () = assert_balance_decreased ctxt ctxt' bonds_account stake in + ctxt') + let test_deposit_then_withdraw () = let* ctxt = new_context () in - lift - @@ let* rollup, ctxt = new_sc_rollup ctxt in - let staker = - Signature.Public_key_hash.of_b58check_exn - "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.withdraw_stake - ctxt - rollup - staker - in - assert_true ctxt + let* rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Signature.Public_key_hash.of_b58check_exn + "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" + in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + let* ctxt = withdraw_stake_and_check_balances ctxt rollup staker in + assert_true ctxt let test_withdrawal_from_missing_rollup () = assert_fails_with_missing_rollup ~loc:__LOC__ (fun ctxt rollup -> @@ -251,20 +347,8 @@ let test_withdrawing_twice () = Signature.Public_key_hash.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.withdraw_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + let* ctxt = withdraw_stake_and_check_balances ctxt rollup staker in assert_fails_with ~loc:__LOC__ (Sc_rollup_stake_storage.Internal_for_tests.withdraw_stake @@ -294,36 +378,30 @@ let valid_inbox_level ctxt = let test_deposit_then_refine () = let* ctxt = new_context () in - lift - @@ let* rollup, ctxt = new_sc_rollup ctxt in - let staker = - Sc_rollup_repr.Staker.of_b58check_exn - "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - let commitment = - Commitment_repr. - { - predecessor = Commitment_repr.Hash.zero; - inbox_level = valid_inbox_level ctxt 1l; - number_of_messages = number_of_messages_exn 3l; - number_of_ticks = number_of_ticks_exn 1232909l; - compressed_state = Sc_rollup_repr.State_hash.zero; - } - in - let* _node, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + let* rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" + in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + let commitment = + Commitment_repr. + { + predecessor = Commitment_repr.Hash.zero; + inbox_level = valid_inbox_level ctxt 1l; + number_of_messages = number_of_messages_exn 3l; + number_of_ticks = number_of_ticks_exn 1232909l; + compressed_state = Sc_rollup_repr.State_hash.zero; + } + in + let* _node, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker commitment - in - assert_true ctxt + in + assert_true ctxt let test_deposit_then_refine_bad_inbox () = let* ctxt = new_context () in @@ -331,13 +409,7 @@ let test_deposit_then_refine_bad_inbox () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -375,7 +447,7 @@ let test_publish () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, _level, ctxt = + let* _node, _level, ctxt, _balance_updates = Sc_rollup_stake_storage.publish_commitment ctxt rollup staker commitment in assert_true ctxt @@ -394,7 +466,7 @@ let test_publish_returns_oldest_publish_level () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, level1, ctxt = + let* _node, level1, ctxt, _balance_updates = lift @@ Sc_rollup_stake_storage.publish_commitment ctxt rollup staker1 commitment in @@ -408,7 +480,7 @@ let test_publish_returns_oldest_publish_level () = current_level in let ctxt = Raw_context.Internal_for_tests.add_level ctxt 10 in - let* _node, level2, _ctxt = + let* _node, level2, _ctxt, _balance_updates = lift @@ Sc_rollup_stake_storage.publish_commitment ctxt rollup staker2 commitment in @@ -442,13 +514,7 @@ let test_withdraw_and_cement () = staker1 commitment in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.withdraw_stake - ctxt - rollup - staker2 - in + let* ctxt = withdraw_stake_and_check_balances ctxt rollup staker2 in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in let* ctxt = lift @@ Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 @@ -457,32 +523,26 @@ let test_withdraw_and_cement () = let test_deposit_then_publish () = let* ctxt = new_context () in - lift - @@ let* rollup, ctxt = new_sc_rollup ctxt in - let staker = - Sc_rollup_repr.Staker.of_b58check_exn - "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - let commitment = - Commitment_repr. - { - predecessor = Commitment_repr.Hash.zero; - inbox_level = valid_inbox_level ctxt 1l; - number_of_messages = number_of_messages_exn 5l; - number_of_ticks = number_of_ticks_exn 152231l; - compressed_state = Sc_rollup_repr.State_hash.zero; - } - in - let* _node, _level, ctxt = - Sc_rollup_stake_storage.publish_commitment ctxt rollup staker commitment - in - assert_true ctxt + let* rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" + in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + let commitment = + Commitment_repr. + { + predecessor = Commitment_repr.Hash.zero; + inbox_level = valid_inbox_level ctxt 1l; + number_of_messages = number_of_messages_exn 5l; + number_of_ticks = number_of_ticks_exn 152231l; + compressed_state = Sc_rollup_repr.State_hash.zero; + } + in + let* _node, _level, ctxt, _balance_updates = + lift + @@ Sc_rollup_stake_storage.publish_commitment ctxt rollup staker commitment + in + assert_true ctxt let test_publish_missing_rollup () = let staker = @@ -510,40 +570,34 @@ let test_cement () = let challenge_window = Constants_storage.sc_rollup_challenge_window_in_blocks ctxt in - lift - @@ let* rollup, ctxt = new_sc_rollup ctxt in - let staker = - Sc_rollup_repr.Staker.of_b58check_exn - "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" - in - let* ctxt = - Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in - let commitment = - Commitment_repr. - { - predecessor = Commitment_repr.Hash.zero; - inbox_level = valid_inbox_level ctxt 1l; - number_of_messages = number_of_messages_exn 3l; - number_of_ticks = number_of_ticks_exn 1232909l; - compressed_state = Sc_rollup_repr.State_hash.zero; - } - in - let* c1, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + let* rollup, ctxt = lift @@ new_sc_rollup ctxt in + let staker = + Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" + in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in + let commitment = + Commitment_repr. + { + predecessor = Commitment_repr.Hash.zero; + inbox_level = valid_inbox_level ctxt 1l; + number_of_messages = number_of_messages_exn 3l; + number_of_ticks = number_of_ticks_exn 1232909l; + compressed_state = Sc_rollup_repr.State_hash.zero; + } + in + let* c1, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker commitment - in - let ctxt = - Raw_context.Internal_for_tests.add_level ctxt challenge_window - in - let* ctxt = Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 in - assert_true ctxt + in + let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in + let* ctxt = + lift @@ Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 + in + assert_true ctxt (* Create and cement three commitments: @@ -626,13 +680,7 @@ let test_cement_then_remove () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -669,13 +717,7 @@ let test_cement_consumes_available_messages () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let* inbox, _n, ctxt = lift @@ Sc_rollup_inbox_storage.add_messages ctxt rollup ["one"; "two"; "three"] @@ -731,13 +773,7 @@ let test_cement_unknown_commitment_fails () = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in assert_fails_with ~loc:__LOC__ (Sc_rollup_stake_storage.cement_commitment @@ -755,13 +791,7 @@ let test_cement_with_zero_stakers_fails () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -781,10 +811,7 @@ let test_cement_with_zero_stakers_fails () = commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in - - let* ctxt = - lift @@ Sc_rollup_stake_storage.remove_staker ctxt rollup staker - in + let* ctxt = remove_staker_and_check_balances ctxt rollup staker in assert_fails_with ~loc:__LOC__ (Sc_rollup_stake_storage.cement_commitment ctxt rollup c1) @@ -800,13 +827,7 @@ let test_cement_fail_too_recent () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -892,13 +913,7 @@ let test_last_cemented_commitment_hash_with_level () = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in let inbox_level = valid_inbox_level ctxt 1l in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -939,13 +954,7 @@ let test_withdrawal_fails_when_not_staked_on_lcc () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let commitment = Commitment_repr. { @@ -1079,40 +1088,41 @@ let test_can_remove_staker () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - lift - @@ let* c1, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + let* c1, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker1 commitment1 - in - let commitment2 = - Commitment_repr. - { - predecessor = c1; - inbox_level = level 2l; - number_of_messages = number_of_messages_exn 3l; - number_of_ticks = number_of_ticks_exn 1232909l; - compressed_state = Sc_rollup_repr.State_hash.zero; - } - in - let* _node, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + in + let commitment2 = + Commitment_repr. + { + predecessor = c1; + inbox_level = level 2l; + number_of_messages = number_of_messages_exn 3l; + number_of_ticks = number_of_ticks_exn 1232909l; + compressed_state = Sc_rollup_repr.State_hash.zero; + } + in + let* _node, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker2 commitment2 - in - let* ctxt = Sc_rollup_stake_storage.remove_staker ctxt rollup staker1 in - let challenge_window = - Constants_storage.sc_rollup_challenge_window_in_blocks ctxt - in - let ctxt = - Raw_context.Internal_for_tests.add_level ctxt challenge_window - in - let* ctxt = Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 in - assert_true ctxt + in + let* ctxt = remove_staker_and_check_balances ctxt rollup staker1 in + let challenge_window = + Constants_storage.sc_rollup_challenge_window_in_blocks ctxt + in + let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in + let* ctxt = + lift @@ Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 + in + assert_true ctxt let test_can_remove_staker2 () = let* ctxt, rollup, staker1, staker2 = @@ -1129,41 +1139,41 @@ let test_can_remove_staker2 () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - lift - @@ let* c1, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + let* c1, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker1 commitment1 - in - let commitment2 = - Commitment_repr. - { - predecessor = c1; - inbox_level = level 2l; - number_of_messages = number_of_messages_exn 3l; - number_of_ticks = number_of_ticks_exn 1232909l; - compressed_state = Sc_rollup_repr.State_hash.zero; - } - in - let* _node, _level, ctxt = - Sc_rollup_stake_storage.Internal_for_tests.refine_stake + in + let commitment2 = + Commitment_repr. + { + predecessor = c1; + inbox_level = level 2l; + number_of_messages = number_of_messages_exn 3l; + number_of_ticks = number_of_ticks_exn 1232909l; + compressed_state = Sc_rollup_repr.State_hash.zero; + } + in + let* _node, _level, ctxt = + lift + @@ Sc_rollup_stake_storage.Internal_for_tests.refine_stake ctxt rollup staker2 commitment2 - in - let* ctxt = Sc_rollup_stake_storage.remove_staker ctxt rollup staker2 in - let challenge_window = - Constants_storage.sc_rollup_challenge_window_in_blocks ctxt - in - let ctxt = - Raw_context.Internal_for_tests.add_level ctxt challenge_window - in - - let* ctxt = Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 in - assert_true ctxt + in + let* ctxt = remove_staker_and_check_balances ctxt rollup staker2 in + let challenge_window = + Constants_storage.sc_rollup_challenge_window_in_blocks ctxt + in + let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in + let* ctxt = + lift @@ Sc_rollup_stake_storage.cement_commitment ctxt rollup c1 + in + assert_true ctxt let test_removed_staker_can_not_withdraw () = let* ctxt, rollup, staker1, staker2 = @@ -1206,7 +1216,7 @@ let test_removed_staker_can_not_withdraw () = staker2 commitment2 in - let* ctxt = + let* ctxt, _ = lift @@ Sc_rollup_stake_storage.remove_staker ctxt rollup staker2 in assert_fails_with @@ -1807,13 +1817,7 @@ let test_staker_cannot_backtrack () = let staker = Sc_rollup_repr.Staker.of_b58check_exn "tz1SdKt9kjPp1HRQFkBmXtBhgMfvdgFhSjmG" in - let* ctxt = - lift - @@ Sc_rollup_stake_storage.Internal_for_tests.deposit_stake - ctxt - rollup - staker - in + let* ctxt = deposit_stake_and_check_balances ctxt rollup staker in let level = valid_inbox_level ctxt in let commitment1 = Commitment_repr. @@ -2423,6 +2427,10 @@ let tests = "deposit to missing rollup fails" `Quick test_deposit_to_missing_rollup; + Tztest.tztest + "deposit by underfunded staker" + `Quick + test_deposit_by_underfunded_staker; Tztest.tztest "deposit to existing rollup" `Quick diff --git a/src/proto_alpha/lib_protocol/token.ml b/src/proto_alpha/lib_protocol/token.ml index a26ae07f96cc0b351219b2a6e1958ad9cab7476f..6e1de3ef52308cbbfd0702d3daea3efbccbc92f4 100644 --- a/src/proto_alpha/lib_protocol/token.ml +++ b/src/proto_alpha/lib_protocol/token.ml @@ -51,6 +51,7 @@ type infinite_sink = | `Double_signing_punishments | `Lost_endorsing_rewards of Signature.Public_key_hash.t * bool * bool | `Tx_rollup_rejection_punishments + | `Sc_rollup_refutation_punishments | `Burned ] type sink = [infinite_sink | container] @@ -112,6 +113,7 @@ let credit ctxt dest amount origin = | `Double_signing_punishments -> Double_signing_punishments | `Lost_endorsing_rewards (d, p, r) -> Lost_endorsing_rewards (d, p, r) | `Tx_rollup_rejection_punishments -> Tx_rollup_rejection_punishments + | `Sc_rollup_refutation_punishments -> Sc_rollup_refutation_punishments | `Burned -> Burned in return (ctxt, sink) diff --git a/src/proto_alpha/lib_protocol/token.mli b/src/proto_alpha/lib_protocol/token.mli index 31009881c8f0224b382c489fbb6428e123e434f7..e7ff1c45c6b57c54e10ec330b9599cec2942f092 100644 --- a/src/proto_alpha/lib_protocol/token.mli +++ b/src/proto_alpha/lib_protocol/token.mli @@ -74,6 +74,7 @@ type infinite_sink = | `Double_signing_punishments | `Lost_endorsing_rewards of Signature.Public_key_hash.t * bool * bool | `Tx_rollup_rejection_punishments + | `Sc_rollup_refutation_punishments | `Burned ] (** [sink] is the type of token receivers. Token receivers that are not diff --git a/tests_python/tests_alpha/test_mockup.py b/tests_python/tests_alpha/test_mockup.py index cde8276531652af30a797c143902de36c359506a..5535e1c3bfd8478a71a91b5aa4fda8e2884d5d2f 100644 --- a/tests_python/tests_alpha/test_mockup.py +++ b/tests_python/tests_alpha/test_mockup.py @@ -681,7 +681,7 @@ def _test_create_mockup_init_show_roundtrip( "sc_rollup_origination_size": 6_314, "sc_rollup_challenge_window_in_blocks": 20_160, "sc_rollup_max_available_messages": 1_000_000, - "sc_rollup_stake_amount_in_mutez": 42_000_000, + "sc_rollup_stake_amount": "42000000", "sc_rollup_commitment_period_in_blocks": 40, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 10_000, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- others.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- others.out index 2a40f893342789a9b8634be3b5594340fb8c8d0e..63715d6a638cc5788fc781df3aea56603d7f40f9 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- others.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode client) RPC regression tests- others.out @@ -48,7 +48,7 @@ "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- others.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- others.out index 9a20480b7cb9e41a81bb0562223dc81d1317e86c..bb66cdfcd14a157039f17472a664ed94ad0b6c6f 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- others.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode light) RPC regression tests- others.out @@ -48,7 +48,7 @@ "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- others.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- others.out index f9116a5168d500f1141e98bf5242740461503a6b..3e5f789a7bc1e299e7e05257b2d293d018aebc1f 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- others.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy) RPC regression tests- others.out @@ -48,7 +48,7 @@ "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- others.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- others.out index c848a82fc7ff99a78befbf84bbe56e03eb1afc0d..4e1784032912c97e213fda4c2e4895977171306d 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- others.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_data_dir) RPC regression tests- others.out @@ -48,7 +48,7 @@ "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- others.out b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- others.out index c848a82fc7ff99a78befbf84bbe56e03eb1afc0d..4e1784032912c97e213fda4c2e4895977171306d 100644 --- a/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- others.out +++ b/tezt/tests/expected/RPC_test.ml/Alpha- (mode proxy_server_rpc) RPC regression tests- others.out @@ -48,7 +48,7 @@ "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (commitm.out b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (commitm.out index 4beddf9946e4ee4488bf00be736760c5fada770d..83bdd59e186145b3e2231724cfa7bfe953343948 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (commitm.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (commitm.out @@ -81,7 +81,7 @@ This sequence of operations was run: "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (first_p.out b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (first_p.out index 56e9bba0a8f7b4d0c8e5bea7ed0c2b7768711f8e..cd2c971b191473752b466c5a1e69f5752425c112 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (first_p.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (first_p.out @@ -81,7 +81,7 @@ This sequence of operations was run: "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (handles.out b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (handles.out index 133738e60b41d7bc19a76c6b95b7048ead732fac..ef7e4df7dbb7d6790709c8857ece70c0d6aff2a7 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (handles.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (handles.out @@ -81,7 +81,7 @@ This sequence of operations was run: "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (message.out b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (message.out index 88d73b7fd01a888f73476c787f2fe87a80dc2a87..7adc069a5e59b569e2652080a312bb427ed4b982 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (message.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (message.out @@ -81,7 +81,7 @@ This sequence of operations was run: "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000, diff --git a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (non_fin.out b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (non_fin.out index b55c5fc3faad69bc5eb8740a4c99c1e13ae7af31..f35c6f59e5f9239bcb28ba2fef3b0c2d974e6926 100644 --- a/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (non_fin.out +++ b/tezt/tests/expected/sc_rollup.ml/Alpha- observing the correct handling of commitments in the rollup node (non_fin.out @@ -81,7 +81,7 @@ This sequence of operations was run: "sc_rollup_origination_size": 6314, "sc_rollup_challenge_window_in_blocks": 20160, "sc_rollup_max_available_messages": 1000000, - "sc_rollup_stake_amount_in_mutez": 32000000, + "sc_rollup_stake_amount": "32000000", "sc_rollup_commitment_period_in_blocks": 30, "sc_rollup_commitment_storage_size_in_bytes": 84, "sc_rollup_max_lookahead_in_blocks": 30000,