diff --git a/src/proto_alpha/lib_client/operation_result.ml b/src/proto_alpha/lib_client/operation_result.ml index 58e3cb4c80c0e7e322b90fe2cd8827da1346c1c1..32c8bb97833e3c1dbcfab48b7e3dbe9dae1f896c 100644 --- a/src/proto_alpha/lib_client/operation_result.ml +++ b/src/proto_alpha/lib_client/operation_result.ml @@ -686,13 +686,19 @@ 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}) = + (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 + 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}) = diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 02f17b96e8db6309885ea54a7310bb01534b3582..4ff360e07f399282d0cb146b334625a1bd6eb694 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2660,14 +2660,14 @@ module Sc_rollup : sig t -> Staker.t -> Commitment.t -> - (Commitment_hash.t * context) tzresult Lwt.t + (Commitment_hash.t * Raw_level.t * context) tzresult Lwt.t val publish_commitment : context -> t -> Staker.t -> Commitment.t -> - (Commitment_hash.t * context) tzresult Lwt.t + (Commitment_hash.t * Raw_level.t * context) tzresult Lwt.t val cement_commitment : context -> t -> Commitment_hash.t -> context tzresult Lwt.t diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index 32df61a1941ba5cfab5409eee6891a59ae8a267c..42694c1fbcf1b93a238992fbb77f6f3c4d37cc50 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1750,9 +1750,11 @@ let apply_external_manager_operation_content : return (ctxt, result, []) | Sc_rollup_publish {rollup; commitment} -> Sc_rollup.publish_commitment ctxt rollup source commitment - >>=? fun (staked_hash, ctxt) -> + >>=? fun (staked_hash, published_at_level, ctxt) -> let consumed_gas = Gas.consumed ~since:before_operation ~until:ctxt in - let result = Sc_rollup_publish_result {staked_hash; consumed_gas} in + let result = + Sc_rollup_publish_result {staked_hash; consumed_gas; published_at_level} + in return (ctxt, result, []) | Sc_rollup_refute {rollup; opponent; refutation} -> Sc_rollup.update_game ctxt rollup ~player:source ~opponent refutation diff --git a/src/proto_alpha/lib_protocol/apply_results.ml b/src/proto_alpha/lib_protocol/apply_results.ml index 312d09ab8f1bb4b9ac0c944ec34d517f80205860..a53e9b1970bfbe65b1637cac88adf24ef6c91f49 100644 --- a/src/proto_alpha/lib_protocol/apply_results.ml +++ b/src/proto_alpha/lib_protocol/apply_results.ml @@ -237,6 +237,7 @@ type _ successful_manager_operation_result = | Sc_rollup_publish_result : { consumed_gas : Gas.Arith.fp; staked_hash : Sc_rollup.Commitment_hash.t; + published_at_level : Raw_level.t; } -> Kind.sc_rollup_publish successful_manager_operation_result | Sc_rollup_refute_result : { @@ -956,21 +957,28 @@ module Manager_result = struct make ~op_case:Operation.Encoding.Manager_operations.sc_rollup_publish_case ~encoding: - (obj3 + (obj4 (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 "staked_hash" Sc_rollup.Commitment_hash.encoding) + (req "published_at_level" Raw_level.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} -> - (Gas.Arith.ceil consumed_gas, consumed_gas, staked_hash)) + | Sc_rollup_publish_result + {consumed_gas; staked_hash; published_at_level} -> + ( Gas.Arith.ceil consumed_gas, + consumed_gas, + staked_hash, + published_at_level )) ~kind:Kind.Sc_rollup_publish_manager_kind - ~inj:(fun (consumed_gas, consumed_milligas, staked_hash) -> + ~inj: + (fun (consumed_gas, consumed_milligas, staked_hash, published_at_level) -> assert (Gas.Arith.(equal (ceil consumed_milligas) consumed_gas)) ; - Sc_rollup_publish_result {consumed_gas = consumed_milligas; staked_hash}) + Sc_rollup_publish_result + {consumed_gas = consumed_milligas; staked_hash; published_at_level}) let sc_rollup_refute_case = make diff --git a/src/proto_alpha/lib_protocol/apply_results.mli b/src/proto_alpha/lib_protocol/apply_results.mli index 70a2ddadfb44e5950ccf000e2b909b8159ae4e53..2f8558806d52f834523df5e7288512b023c2bceb 100644 --- a/src/proto_alpha/lib_protocol/apply_results.mli +++ b/src/proto_alpha/lib_protocol/apply_results.mli @@ -273,6 +273,7 @@ and _ successful_manager_operation_result = | Sc_rollup_publish_result : { consumed_gas : Gas.Arith.fp; staked_hash : Sc_rollup.Commitment_hash.t; + published_at_level : Raw_level.t; } -> Kind.sc_rollup_publish successful_manager_operation_result | Sc_rollup_refute_result : { diff --git a/src/proto_alpha/lib_protocol/sc_rollup_storage.ml b/src/proto_alpha/lib_protocol/sc_rollup_storage.ml index 5578473ff5793fe37c979bbdd4ff527653c845df..579ba4da789bc9125afc1a30653d2b22416ad10e 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_storage.ml +++ b/src/proto_alpha/lib_protocol/sc_rollup_storage.ml @@ -433,7 +433,7 @@ let set_commitment_added ctxt rollup node new_value = let* ctxt, size_diff, _was_bound = Store.Commitment_added.add (ctxt, rollup) node new_value in - return (size_diff, ctxt) + return (size_diff, new_value, ctxt) let deallocate ctxt rollup node = let open Lwt_tzresult_syntax in @@ -598,7 +598,7 @@ let refine_stake ctxt rollup staker commitment = Store.Commitments.add (ctxt, rollup) new_hash commitment in let level = (Raw_context.current_level ctxt).level in - let* commitment_added_size_diff, ctxt = + let* commitment_added_size_diff, commitment_added_level, ctxt = set_commitment_added ctxt rollup new_hash level in let* ctxt, staker_count_diff = @@ -621,7 +621,7 @@ let refine_stake ctxt rollup staker commitment = (* First submission adds [sc_rollup_commitment_storage_size_in_bytes] to storage. Later submission adds 0 due to content-addressing. *) assert (Compare.Int.(size_diff = 0 || size_diff = expected_size_diff)) ; - return (new_hash, ctxt) + return (new_hash, commitment_added_level, ctxt) (* See WARNING above. *)) else if Commitment_hash.(node = lcc) then (* We reached the LCC, but [staker] is not staked directly on it. diff --git a/src/proto_alpha/lib_protocol/sc_rollup_storage.mli b/src/proto_alpha/lib_protocol/sc_rollup_storage.mli index 6a8897842376f4f88511f71fdcdb1e6c24aa8881..802cc699c6aed3a5deb90d8e91ad28fae05d6346 100644 --- a/src/proto_alpha/lib_protocol/sc_rollup_storage.mli +++ b/src/proto_alpha/lib_protocol/sc_rollup_storage.mli @@ -278,7 +278,8 @@ val refine_stake : Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> Sc_rollup_repr.Commitment.t -> - (Sc_rollup_repr.Commitment_hash.t * Raw_context.t) tzresult Lwt.t + (Sc_rollup_repr.Commitment_hash.t * Raw_level_repr.t * Raw_context.t) 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, @@ -301,7 +302,8 @@ val refine_stake : to cover the deposit} } - Returns the hash of the given commitment. + Returns the hash of the given commitment, and the level when the commitment + was first published by some staker. This function does not authenticate the staker. *) val publish_commitment : @@ -309,7 +311,8 @@ val publish_commitment : Sc_rollup_repr.t -> Sc_rollup_repr.Staker.t -> Sc_rollup_repr.Commitment.t -> - (Sc_rollup_repr.Commitment_hash.t * Raw_context.t) tzresult Lwt.t + (Sc_rollup_repr.Commitment_hash.t * Raw_level_repr.t * Raw_context.t) tzresult + Lwt.t (** [last_cemented_commitment context rollup] returns the last cemented commitment of the rollup. 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 e209b3818b1be02e09ae20a34886c50b86a5081a..b49702b83bfe71f528ac32550de617fb2dc2d5dd 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 @@ -260,7 +260,7 @@ let test_deposit_then_refine () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker commitment in assert_true ctxt @@ -305,11 +305,46 @@ let test_publish () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.publish_commitment ctxt rollup staker commitment in assert_true ctxt +let test_publish_returns_oldest_publish_level () = + let* ctxt, rollup, staker1, staker2 = + originate_rollup_and_deposit_with_two_stakers () + in + let commitment = + Sc_rollup_repr.Commitment. + { + predecessor = Sc_rollup_repr.Commitment_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, level1, ctxt = + lift @@ Sc_rollup_storage.publish_commitment ctxt rollup staker1 commitment + in + let current_level = + Raw_level_repr.to_int32 (Raw_context.current_level ctxt).level + in + let* () = + Assert.equal_int32 + ~loc:__LOC__ + (Raw_level_repr.to_int32 level1) + current_level + in + let ctxt = Raw_context.Internal_for_tests.add_level ctxt 10 in + let* _node, level2, _ctxt = + lift @@ Sc_rollup_storage.publish_commitment ctxt rollup staker2 commitment + in + Assert.equal_int32 + ~loc:__LOC__ + (Raw_level_repr.to_int32 level1) + (Raw_level_repr.to_int32 level2) + let test_withdraw_and_cement () = let* ctxt, rollup, staker1, staker2 = originate_rollup_and_deposit_with_two_stakers () @@ -327,7 +362,7 @@ let test_withdraw_and_cement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment in let* ctxt = lift @@ Sc_rollup_storage.withdraw_stake ctxt rollup staker2 in @@ -354,7 +389,7 @@ let test_deposit_then_publish () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.publish_commitment ctxt rollup staker commitment in assert_true ctxt @@ -398,7 +433,7 @@ let test_cement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = @@ -432,7 +467,7 @@ let test_cement_three_commitments () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let commitment = @@ -445,7 +480,7 @@ let test_cement_three_commitments () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c2, ctxt = + let* c2, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let commitment = @@ -458,7 +493,7 @@ let test_cement_three_commitments () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c3, ctxt = + let* c3, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in @@ -487,7 +522,7 @@ let test_cement_then_remove () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in @@ -523,7 +558,7 @@ let test_cement_consumes_available_messages () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in @@ -584,7 +619,7 @@ let test_cement_with_zero_stakers_fails () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in @@ -616,7 +651,7 @@ let test_cement_fail_too_recent () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let* () = @@ -650,7 +685,7 @@ let test_cement_deadline_uses_oldest_add_time () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment in let challenge_window = @@ -658,7 +693,7 @@ let test_cement_deadline_uses_oldest_add_time () = in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in - let* c2, ctxt = + let* c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment in let* ctxt = lift @@ Sc_rollup_storage.cement_commitment ctxt rollup c1 in @@ -685,7 +720,7 @@ let test_last_cemented_commitment_hash_with_level () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in let ctxt = Raw_context.Internal_for_tests.add_level ctxt challenge_window in @@ -717,7 +752,7 @@ let test_withdrawal_fails_when_not_staked_on_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in assert_fails_with @@ -751,10 +786,10 @@ let test_stake_on_existing_node () = } in lift - @@ let* _node, ctxt = + @@ let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment in assert_true ctxt @@ -775,7 +810,7 @@ let test_cement_with_two_stakers () = } in lift - @@ let* c1, ctxt = + @@ let* c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -788,7 +823,7 @@ let test_cement_with_two_stakers () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let challenge_window = @@ -817,7 +852,7 @@ let test_can_remove_staker () = } in lift - @@ let* c1, ctxt = + @@ let* c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -830,7 +865,7 @@ let test_can_remove_staker () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let* ctxt = Sc_rollup_storage.remove_staker ctxt rollup staker1 in @@ -859,7 +894,7 @@ let test_can_remove_staker2 () = } in lift - @@ let* c1, ctxt = + @@ let* c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -872,7 +907,7 @@ let test_can_remove_staker2 () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let* ctxt = Sc_rollup_storage.remove_staker ctxt rollup staker2 in @@ -901,7 +936,7 @@ let test_removed_staker_can_not_withdraw () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -914,7 +949,7 @@ let test_removed_staker_can_not_withdraw () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let* ctxt = lift @@ Sc_rollup_storage.remove_staker ctxt rollup staker2 in @@ -938,7 +973,7 @@ let test_no_cement_on_conflict () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -951,7 +986,7 @@ let test_no_cement_on_conflict () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let ctxt = Raw_context.Internal_for_tests.add_level ctxt 5000 in @@ -980,7 +1015,7 @@ let test_no_cement_with_one_staker_at_zero_commitment () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let challenge_window = @@ -1007,7 +1042,7 @@ let test_non_cemented_parent () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1020,7 +1055,7 @@ let test_non_cemented_parent () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c2, ctxt = + let* c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let challenge_window = @@ -1047,7 +1082,7 @@ let test_finds_conflict_point_at_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1060,7 +1095,7 @@ let test_finds_conflict_point_at_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _c2, ctxt = + let* _c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let* (left, _right), ctxt = @@ -1083,7 +1118,7 @@ let test_finds_conflict_point_beneath_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1096,7 +1131,7 @@ let test_finds_conflict_point_beneath_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c2, ctxt = + let* c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment2 in let commitment3 = @@ -1109,7 +1144,7 @@ let test_finds_conflict_point_beneath_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c3, ctxt = + let* c3, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment3 in let* (left, right), ctxt = @@ -1133,7 +1168,7 @@ let test_conflict_point_is_first_point_of_disagreement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1146,7 +1181,7 @@ let test_conflict_point_is_first_point_of_disagreement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c2, ctxt = + let* c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment2 in let commitment3 = @@ -1159,7 +1194,7 @@ let test_conflict_point_is_first_point_of_disagreement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c3, ctxt = + let* c3, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment3 in let commitment4 = @@ -1172,7 +1207,7 @@ let test_conflict_point_is_first_point_of_disagreement () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _c4, ctxt = + let* _c4, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment4 in let* (left, right), ctxt = @@ -1206,10 +1241,10 @@ let test_conflict_point_computation_fits_in_gas_limit () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* root_commitment_hash, ctxt = + let* root_commitment_hash, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 root_commitment in - let* _, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 root_commitment in let rec branch ctxt staker_id staker predecessor i max acc = @@ -1223,7 +1258,7 @@ let test_conflict_point_computation_fits_in_gas_limit () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* commitment_hash, ctxt = + let* commitment_hash, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment in if i = max then @@ -1269,7 +1304,7 @@ let test_no_conflict_point_one_staker_at_lcc_preboot () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _, ctxt = + let* _, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment in assert_fails_with @@ -1301,7 +1336,7 @@ let test_no_conflict_point_one_staker_at_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1314,7 +1349,7 @@ let test_no_conflict_point_one_staker_at_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _node, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in let challenge_window = @@ -1341,10 +1376,10 @@ let test_no_conflict_point_both_stakers_at_lcc () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in - let* _node, ctxt = + let* _node, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment1 in let challenge_window = @@ -1375,7 +1410,7 @@ let test_staker_cannot_backtrack () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment1 in let commitment2 = @@ -1388,7 +1423,7 @@ let test_staker_cannot_backtrack () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _, ctxt = + let* _, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker commitment2 in assert_fails_with @@ -1411,7 +1446,7 @@ let test_staker_cannot_change_branch () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c1, ctxt = + let* c1, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in let commitment2 = @@ -1424,7 +1459,7 @@ let test_staker_cannot_change_branch () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* c2, ctxt = + let* c2, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment2 in let commitment3 = @@ -1438,7 +1473,7 @@ let test_staker_cannot_change_branch () = } in - let* _c3, ctxt = + let* _c3, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment3 in let commitment4 = @@ -1451,7 +1486,7 @@ let test_staker_cannot_change_branch () = compressed_state = Sc_rollup_repr.State_hash.zero; } in - let* _c4, ctxt = + let* _c4, _level, ctxt = lift @@ Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment4 in assert_fails_with @@ -1563,20 +1598,20 @@ let test_concurrent_refinement_point_of_conflict () = in let* (c1, c2), _ctxt = lift - @@ let* _c1, ctxt = + @@ let* _c1, _level, ctxt = Sc_rollup_storage.refine_stake before_ctxt rollup staker1 commitment1 in - let* _c2, ctxt = + let* _c2, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment2 in Sc_rollup_storage.get_conflict_point ctxt rollup staker1 staker2 in let* (c1', c2'), ctxt = lift - @@ let* _c2, ctxt = + @@ let* _c2, _level, ctxt = Sc_rollup_storage.refine_stake before_ctxt rollup staker2 commitment2 in - let* _c1, ctxt = + let* _c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment1 in Sc_rollup_storage.get_conflict_point ctxt rollup staker1 staker2 @@ -1600,10 +1635,10 @@ let test_concurrent_refinement_cement () = in let* c1, _ctxt = lift - @@ let* c1, ctxt = + @@ let* c1, _level, ctxt = Sc_rollup_storage.refine_stake before_ctxt rollup staker1 commitment in - let* _c2, ctxt = + let* _c2, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker2 commitment in let challenge_window = @@ -1617,10 +1652,10 @@ let test_concurrent_refinement_cement () = in let* c2, ctxt = lift - @@ let* c2, ctxt = + @@ let* c2, _level, ctxt = Sc_rollup_storage.refine_stake before_ctxt rollup staker2 commitment in - let* _c1, ctxt = + let* _c1, _level, ctxt = Sc_rollup_storage.refine_stake ctxt rollup staker1 commitment in let challenge_window = @@ -1726,6 +1761,10 @@ let tests = test_deposit_then_refine_bad_inbox; Tztest.tztest "stake on existing node" `Quick test_stake_on_existing_node; Tztest.tztest "publish commitment" `Quick test_publish; + Tztest.tztest + "publish commitment returns level when commitment was first published" + `Quick + test_publish_returns_oldest_publish_level; Tztest.tztest "withdraw stake of another staker before cementing" `Quick