From 6ac69f07abc36e3358373b31524b5923e8245773 Mon Sep 17 00:00:00 2001 From: Marina Polubelova Date: Mon, 15 Jul 2024 15:55:18 +0200 Subject: [PATCH 1/2] Proto/Tests: add test for min-delegated RPC for last and first blocks --- .../lib_protocol/test/helpers/tez_helpers.ml | 4 + .../lib_protocol/test/helpers/tez_helpers.mli | 4 + .../unit/test_full_staking_balance_repr.ml | 130 ++++++++++++++++++ 3 files changed, 138 insertions(+) diff --git a/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.ml b/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.ml index 1be51c6b3a1e..4ac40ba9df0f 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.ml +++ b/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.ml @@ -64,6 +64,10 @@ let of_mutez x = let to_mutez = Tez.to_mutez +let to_repr x = Tez_repr.of_mutez_exn @@ to_mutez x + +let of_repr x = of_mutez @@ Tez_repr.to_mutez x + (* Should be the same as Tez.max_mutez *) let max_tez = match Tez.of_mutez Int64.max_int with None -> assert false | Some p -> p diff --git a/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.mli b/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.mli index 57d5501364ef..7d19cdeb9d41 100644 --- a/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.mli +++ b/src/proto_alpha/lib_protocol/test/helpers/tez_helpers.mli @@ -48,6 +48,10 @@ val to_mutez : t -> int64 (* Is actually of_mutez_exn *) val of_mutez : int64 -> t +val to_repr : t -> Protocol.Tez_repr.t + +val of_repr : Protocol.Tez_repr.t -> t + val min : t -> t -> t module Compare : Compare.S with type t := t diff --git a/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml index 8c7878495df0..1ce0c29e2716 100644 --- a/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/test/unit/test_full_staking_balance_repr.ml @@ -494,6 +494,32 @@ let check_min_delegated_and_its_level ~blocks_per_cycle ~current_level in return_unit +let check_min_delegated_and_its_level_rpc b ~(delegate : Contract.t) + ~min_delegated ~min_delegated_level = + let open Lwt_result_wrap_syntax in + let* min_delegated_in_current_cycle_rpc = + get_min_delegated_in_current_cycle b ~delegate + in + let min_delegated_in_cycle_rpc, level_of_min_delegated_rpc = + min_delegated_in_current_cycle_rpc + in + let* () = + Assert.equal_tez_repr ~loc:__LOC__ min_delegated_in_cycle_rpc min_delegated + in + let* () = + Assert.equal + ~loc:__LOC__ + (Option.equal Level_repr.( = )) + "level_min_delegated are not equal" + (fun ppf x -> + match x with + | Some x -> Format.fprintf ppf "%a" Level_repr.pp x + | None -> Format.fprintf ppf "None") + min_delegated_level + level_of_min_delegated_rpc + in + return_unit + let print_min_delegated_in_cycle_rpc b ~(delegate : Contract.t) = let open Lwt_result_wrap_syntax in let* liquid_balance = Context.Contract.balance (B b) delegate in @@ -740,6 +766,106 @@ let test_min_delegated_in_cycle () = in return_unit +(* Remove X tez in the last block and add Y tez in the first block of + the next cycle *) +let test_min_delegated_rpc_for_last_and_first_blocks () = + let open Lwt_result_wrap_syntax in + let constants = + constants |> Constants_helpers.Set.Adaptive_issuance.force_activation true + in + let get_staking_balance b ~delegate = + let* () = print_min_delegated_in_cycle_rpc b ~delegate in + let* staking_balance = get_staking_balance b ~delegate in + return staking_balance + in + let level_from_int32 level = + let blocks_per_cycle = constants.blocks_per_cycle in + let*? cycle_eras = cycle_eras_init ~blocks_per_cycle in + let* level = level_from_int ~cycle_eras level in + return level + in + + let* b, (delegate, contractor) = Context.init_with_constants2 constants in + Log.info ~color:Log.Color.BG.blue "Initial state" ; + let* _staking_balance = get_staking_balance b ~delegate in + let delegated_init = Tez_repr.(mul_exn one 3_800_000) in + let* zero_level = level_from_int32 0l in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_init + ~min_delegated_level:(Some zero_level) + in + + Log.info ~color:Log.Color.BG.blue "Baking until the last level of 1st cycle" ; + let*?@ last_level = + Raw_level.of_int32 (Int32.sub constants.blocks_per_cycle 2l) + in + let* b = Block.bake_until_level last_level b in + let* _staking_balance = get_staking_balance b ~delegate in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_init + ~min_delegated_level:(Some zero_level) + in + + (* Remove 1000 tez from delegated_balance in the last block *) + Log.info ~color:Log.Color.BG.blue "Removing 1_000 tez in the last block" ; + let amount_1000 = Tez_helpers.of_int 1000 in + let* op_minus_1000 = Op.transaction (B b) delegate contractor amount_1000 in + let* b = Block.bake ~operation:op_minus_1000 b in + let* _staking_balance = get_staking_balance b ~delegate in + let*?@ delegated_minus_1000 = + Tez_repr.(delegated_init -? Tez_helpers.to_repr amount_1000) + in + let* last_level_of_fst_block = level_from_int32 (Block.current_level b) in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_minus_1000 + ~min_delegated_level:(Some last_level_of_fst_block) + in + + (* Add 5000 tez to delegated_balance in 1st block of the next cycle *) + Log.info + ~color:Log.Color.BG.blue + "Adding 5_000 tez in 1st block of the next cycle" ; + let amount_5000 = Tez_helpers.of_int 5000 in + let* op_plus_5000 = Op.transaction (B b) contractor delegate amount_5000 in + let* b = Block.bake ~operation:op_plus_5000 b in + let* _staking_balance = get_staking_balance b ~delegate in + let*?@ delegated_plus_5000 = + Tez_repr.(delegated_minus_1000 +? Tez_helpers.to_repr amount_5000) + in + let* first_level_of_snd_block = level_from_int32 (Block.current_level b) in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_plus_5000 + ~min_delegated_level:(Some first_level_of_snd_block) + in + + (* Baking until the last level of 2nd cycle *) + Log.info ~color:Log.Color.BG.blue "Baking until the last level of 2nd cycle" ; + let*?@ last_level_2nd_cycle = + Raw_level.of_int32 (Int32.sub (Int32.mul constants.blocks_per_cycle 2l) 1l) + in + let* b = Block.bake_until_level last_level_2nd_cycle b in + let* _staking_balance = get_staking_balance b ~delegate in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_plus_5000 + ~min_delegated_level:(Some first_level_of_snd_block) + in + return_unit + type kind = Add | Remove let title_color = Log.Color.FG.yellow @@ -1336,6 +1462,10 @@ let tests = [ tztest "full staking balance - encoding" `Quick test_encodings; tztest "min delegated in cycle" `Quick test_min_delegated_in_cycle; + tztest + "min delegated RPC for last and first blocks" + `Quick + test_min_delegated_rpc_for_last_and_first_blocks; tztest "add delegated (different cycle)" `Quick -- GitLab From a9e747ea7a37752d612aa73682f53625d61bb10a Mon Sep 17 00:00:00 2001 From: Marina Polubelova Date: Wed, 4 Sep 2024 11:46:30 +0200 Subject: [PATCH 2/2] Quebec/Tests: add test for min-delegated RPC for last and first blocks Porting to proto 021_PsquebeC ae04a17563615e436a7113e5f19e6b8ec484df68 - Proto/Tests: add test for min-delegated RPC for last and first blocks --- .../lib_protocol/test/helpers/tez_helpers.ml | 4 + .../lib_protocol/test/helpers/tez_helpers.mli | 4 + .../unit/test_full_staking_balance_repr.ml | 130 ++++++++++++++++++ 3 files changed, 138 insertions(+) diff --git a/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.ml b/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.ml index 1be51c6b3a1e..4ac40ba9df0f 100644 --- a/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.ml +++ b/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.ml @@ -64,6 +64,10 @@ let of_mutez x = let to_mutez = Tez.to_mutez +let to_repr x = Tez_repr.of_mutez_exn @@ to_mutez x + +let of_repr x = of_mutez @@ Tez_repr.to_mutez x + (* Should be the same as Tez.max_mutez *) let max_tez = match Tez.of_mutez Int64.max_int with None -> assert false | Some p -> p diff --git a/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.mli b/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.mli index 57d5501364ef..7d19cdeb9d41 100644 --- a/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.mli +++ b/src/proto_021_PsquebeC/lib_protocol/test/helpers/tez_helpers.mli @@ -48,6 +48,10 @@ val to_mutez : t -> int64 (* Is actually of_mutez_exn *) val of_mutez : int64 -> t +val to_repr : t -> Protocol.Tez_repr.t + +val of_repr : Protocol.Tez_repr.t -> t + val min : t -> t -> t module Compare : Compare.S with type t := t diff --git a/src/proto_021_PsquebeC/lib_protocol/test/unit/test_full_staking_balance_repr.ml b/src/proto_021_PsquebeC/lib_protocol/test/unit/test_full_staking_balance_repr.ml index c3f747b6d77f..9893d1088473 100644 --- a/src/proto_021_PsquebeC/lib_protocol/test/unit/test_full_staking_balance_repr.ml +++ b/src/proto_021_PsquebeC/lib_protocol/test/unit/test_full_staking_balance_repr.ml @@ -494,6 +494,32 @@ let check_min_delegated_and_its_level ~blocks_per_cycle ~current_level in return_unit +let check_min_delegated_and_its_level_rpc b ~(delegate : Contract.t) + ~min_delegated ~min_delegated_level = + let open Lwt_result_wrap_syntax in + let* min_delegated_in_current_cycle_rpc = + get_min_delegated_in_current_cycle b ~delegate + in + let min_delegated_in_cycle_rpc, level_of_min_delegated_rpc = + min_delegated_in_current_cycle_rpc + in + let* () = + Assert.equal_tez_repr ~loc:__LOC__ min_delegated_in_cycle_rpc min_delegated + in + let* () = + Assert.equal + ~loc:__LOC__ + (Option.equal Level_repr.( = )) + "level_min_delegated are not equal" + (fun ppf x -> + match x with + | Some x -> Format.fprintf ppf "%a" Level_repr.pp x + | None -> Format.fprintf ppf "None") + min_delegated_level + level_of_min_delegated_rpc + in + return_unit + let print_min_delegated_in_cycle_rpc b ~(delegate : Contract.t) = let open Lwt_result_wrap_syntax in let* liquid_balance = Context.Contract.balance (B b) delegate in @@ -740,6 +766,106 @@ let test_min_delegated_in_cycle () = in return_unit +(* Remove X tez in the last block and add Y tez in the first block of + the next cycle *) +let test_min_delegated_rpc_for_last_and_first_blocks () = + let open Lwt_result_wrap_syntax in + let constants = + constants |> Constants_helpers.Set.Adaptive_issuance.force_activation true + in + let get_staking_balance b ~delegate = + let* () = print_min_delegated_in_cycle_rpc b ~delegate in + let* staking_balance = get_staking_balance b ~delegate in + return staking_balance + in + let level_from_int32 level = + let blocks_per_cycle = constants.blocks_per_cycle in + let*? cycle_eras = cycle_eras_init ~blocks_per_cycle in + let* level = level_from_int ~cycle_eras level in + return level + in + + let* b, (delegate, contractor) = Context.init_with_constants2 constants in + Log.info ~color:Log.Color.BG.blue "Initial state" ; + let* _staking_balance = get_staking_balance b ~delegate in + let delegated_init = Tez_repr.(mul_exn one 3_800_000) in + let* zero_level = level_from_int32 0l in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_init + ~min_delegated_level:(Some zero_level) + in + + Log.info ~color:Log.Color.BG.blue "Baking until the last level of 1st cycle" ; + let*?@ last_level = + Raw_level.of_int32 (Int32.sub constants.blocks_per_cycle 2l) + in + let* b = Block.bake_until_level last_level b in + let* _staking_balance = get_staking_balance b ~delegate in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_init + ~min_delegated_level:(Some zero_level) + in + + (* Remove 1000 tez from delegated_balance in the last block *) + Log.info ~color:Log.Color.BG.blue "Removing 1_000 tez in the last block" ; + let amount_1000 = Tez_helpers.of_int 1000 in + let* op_minus_1000 = Op.transaction (B b) delegate contractor amount_1000 in + let* b = Block.bake ~operation:op_minus_1000 b in + let* _staking_balance = get_staking_balance b ~delegate in + let*?@ delegated_minus_1000 = + Tez_repr.(delegated_init -? Tez_helpers.to_repr amount_1000) + in + let* last_level_of_fst_block = level_from_int32 (Block.current_level b) in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_minus_1000 + ~min_delegated_level:(Some last_level_of_fst_block) + in + + (* Add 5000 tez to delegated_balance in 1st block of the next cycle *) + Log.info + ~color:Log.Color.BG.blue + "Adding 5_000 tez in 1st block of the next cycle" ; + let amount_5000 = Tez_helpers.of_int 5000 in + let* op_plus_5000 = Op.transaction (B b) contractor delegate amount_5000 in + let* b = Block.bake ~operation:op_plus_5000 b in + let* _staking_balance = get_staking_balance b ~delegate in + let*?@ delegated_plus_5000 = + Tez_repr.(delegated_minus_1000 +? Tez_helpers.to_repr amount_5000) + in + let* first_level_of_snd_block = level_from_int32 (Block.current_level b) in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_plus_5000 + ~min_delegated_level:(Some first_level_of_snd_block) + in + + (* Baking until the last level of 2nd cycle *) + Log.info ~color:Log.Color.BG.blue "Baking until the last level of 2nd cycle" ; + let*?@ last_level_2nd_cycle = + Raw_level.of_int32 (Int32.sub (Int32.mul constants.blocks_per_cycle 2l) 1l) + in + let* b = Block.bake_until_level last_level_2nd_cycle b in + let* _staking_balance = get_staking_balance b ~delegate in + let* () = + check_min_delegated_and_its_level_rpc + b + ~delegate + ~min_delegated:delegated_plus_5000 + ~min_delegated_level:(Some first_level_of_snd_block) + in + return_unit + type kind = Add | Remove let title_color = Log.Color.FG.yellow @@ -1336,6 +1462,10 @@ let tests = [ tztest "full staking balance - encoding" `Quick test_encodings; tztest "min delegated in cycle" `Quick test_min_delegated_in_cycle; + tztest + "min delegated RPC for last and first blocks" + `Quick + test_min_delegated_rpc_for_last_and_first_blocks; tztest "add delegated (different cycle)" `Quick -- GitLab