From 386453bdda4ee0b9fd98a8aabf007ef6fe48d4da Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 12 Oct 2023 18:01:44 +0200 Subject: [PATCH 1/8] Proto/Stake_storage: use Full_staking_balance_repr helper functions --- .../lib_protocol/full_staking_balance_repr.ml | 32 +++++++++++++++- .../full_staking_balance_repr.mli | 14 ++++++- src/proto_alpha/lib_protocol/stake_storage.ml | 38 +++++++------------ 3 files changed, 57 insertions(+), 27 deletions(-) diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index 1d0e825c5522..f4acbc0d6f1a 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -11,7 +11,7 @@ type t = { delegated : Tez_repr.t; } -let make ~own_frozen ~staked_frozen ~delegated = +let init ~own_frozen ~staked_frozen ~delegated = {own_frozen; staked_frozen; delegated} let encoding = @@ -41,3 +41,33 @@ let apply_slashing ~percentage {own_frozen; staked_frozen; delegated} = Tez_repr.mul_percentage ~rounding:`Down staked_frozen remaining_percentage in {own_frozen; staked_frozen; delegated} + +let remove_delegated ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ delegated = Tez_repr.(delegated -? amount) in + {own_frozen; staked_frozen; delegated} + +let remove_own_frozen ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ own_frozen = Tez_repr.(own_frozen -? amount) in + {own_frozen; staked_frozen; delegated} + +let remove_staked_frozen ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ staked_frozen = Tez_repr.(staked_frozen -? amount) in + {own_frozen; staked_frozen; delegated} + +let add_delegated ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ delegated = Tez_repr.(delegated +? amount) in + {own_frozen; staked_frozen; delegated} + +let add_own_frozen ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ own_frozen = Tez_repr.(own_frozen +? amount) in + {own_frozen; staked_frozen; delegated} + +let add_staked_frozen ~amount {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let+ staked_frozen = Tez_repr.(staked_frozen +? amount) in + {own_frozen; staked_frozen; delegated} diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index 0fde0fbfd3ec..74e834ad75e7 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -11,7 +11,7 @@ type t = private { delegated : Tez_repr.t; } -val make : +val init : own_frozen:Tez_repr.t -> staked_frozen:Tez_repr.t -> delegated:Tez_repr.t -> t val encoding : t Data_encoding.t @@ -20,3 +20,15 @@ val encoding : t Data_encoding.t val voting_weight : t -> Int64.t tzresult val apply_slashing : percentage:Int_percentage.t -> t -> t + +val remove_delegated : amount:Tez_repr.t -> t -> t tzresult + +val remove_own_frozen : amount:Tez_repr.t -> t -> t tzresult + +val remove_staked_frozen : amount:Tez_repr.t -> t -> t tzresult + +val add_delegated : amount:Tez_repr.t -> t -> t tzresult + +val add_own_frozen : amount:Tez_repr.t -> t -> t tzresult + +val add_staked_frozen : amount:Tez_repr.t -> t -> t tzresult diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index bd3255e5c265..88981849da4f 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -98,7 +98,7 @@ let has_minimal_stake_and_frozen_stake ctxt let initialize_delegate ctxt delegate ~delegated = let open Lwt_result_syntax in let balance = - Full_staking_balance_repr.make + Full_staking_balance_repr.init ~own_frozen:Tez_repr.zero ~staked_frozen:Tez_repr.zero ~delegated @@ -153,22 +153,16 @@ let update_stake ~f ctxt delegate = | false, false | true, true -> return ctxt let remove_delegated_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ delegated = Tez_repr.(delegated -? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.remove_delegated ~amount in + update_stake ctxt delegate ~f let remove_own_frozen_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ own_frozen = Tez_repr.(own_frozen -? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.remove_own_frozen ~amount in + update_stake ctxt delegate ~f let remove_staked_frozen_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ staked_frozen = Tez_repr.(staked_frozen -? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.remove_staked_frozen ~amount in + update_stake ctxt delegate ~f let remove_frozen_stake_only_call_from_token ctxt staker amount = match staker with @@ -178,22 +172,16 @@ let remove_frozen_stake_only_call_from_token ctxt staker amount = remove_staked_frozen_stake ctxt delegate amount let add_delegated_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ delegated = Tez_repr.(delegated +? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.add_delegated ~amount in + update_stake ctxt delegate ~f let add_own_frozen_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ own_frozen = Tez_repr.(own_frozen +? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.add_own_frozen ~amount in + update_stake ctxt delegate ~f let add_staked_frozen_stake ctxt delegate amount = - let open Result_syntax in - update_stake ctxt delegate ~f:(fun {own_frozen; staked_frozen; delegated} -> - let+ staked_frozen = Tez_repr.(staked_frozen +? amount) in - Full_staking_balance_repr.make ~own_frozen ~staked_frozen ~delegated) + let f = Full_staking_balance_repr.add_staked_frozen ~amount in + update_stake ctxt delegate ~f let add_frozen_stake_only_call_from_token ctxt staker amount = match staker with -- GitLab From 7131f02c0f2f90eb15bd0819ce0c6a5c3561c119 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 30 Nov 2023 11:00:56 +0100 Subject: [PATCH 2/8] Proto/Delegate_sampler: minor rewrite --- src/proto_alpha/lib_protocol/delegate_sampler.ml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index 7e1b60768985..7b25716a1cd5 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -171,7 +171,7 @@ let get_stakes_for_selected_index ctxt ~slashings index = Stake_storage.fold_snapshot ctxt ~index - ~f:(fun (delegate, staking_balance) (acc, total_stake) -> + ~f:(fun (delegate, staking_balance) acc -> let staking_balance = match Signature.Public_key_hash.Map.find delegate slashings with | None -> staking_balance @@ -183,9 +183,10 @@ let get_stakes_for_selected_index ctxt ~slashings index = in if Stake_storage.has_minimal_stake_and_frozen_stake ctxt staking_balance then + let stakes, total_stake = acc in let*? total_stake = Stake_repr.(total_stake +? stake_for_cycle) in - return ((delegate, stake_for_cycle) :: acc, total_stake) - else return (acc, total_stake)) + return ((delegate, stake_for_cycle) :: stakes, total_stake) + else return acc) ~init:([], Stake_repr.zero) let compute_snapshot_index_for_seed ~max_snapshot_index seed = -- GitLab From 4e0721bef5dfe19c23eea054fffc8beb91aa6589 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 30 Nov 2023 11:05:25 +0100 Subject: [PATCH 3/8] Proto/Delegate_sampler: check minimal frozen stake before applying limits We'll get rid of the redundant check in a later commit --- .../lib_protocol/delegate_sampler.ml | 21 ++++++++++++------- .../lib_protocol/full_staking_balance_repr.ml | 4 ++++ .../full_staking_balance_repr.mli | 2 ++ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index 7b25716a1cd5..ac2caa823647 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -168,6 +168,7 @@ let get_delegate_stake_from_staking_balance ctxt delegate staking_balance = let get_stakes_for_selected_index ctxt ~slashings index = let open Lwt_result_syntax in + let minimal_frozen_stake = Constants_storage.minimal_frozen_stake ctxt in Stake_storage.fold_snapshot ctxt ~index @@ -178,14 +179,20 @@ let get_stakes_for_selected_index ctxt ~slashings index = | Some percentage -> Full_staking_balance_repr.apply_slashing ~percentage staking_balance in - let* stake_for_cycle = - get_delegate_stake_from_staking_balance ctxt delegate staking_balance - in - if Stake_storage.has_minimal_stake_and_frozen_stake ctxt staking_balance + if + Full_staking_balance_repr.has_minimal_frozen_stake + ~minimal_frozen_stake + staking_balance then - let stakes, total_stake = acc in - let*? total_stake = Stake_repr.(total_stake +? stake_for_cycle) in - return ((delegate, stake_for_cycle) :: stakes, total_stake) + let* stake_for_cycle = + get_delegate_stake_from_staking_balance ctxt delegate staking_balance + in + if Stake_storage.has_minimal_stake_and_frozen_stake ctxt staking_balance + then + let stakes, total_stake = acc in + let*? total_stake = Stake_repr.(total_stake +? stake_for_cycle) in + return ((delegate, stake_for_cycle) :: stakes, total_stake) + else return acc else return acc) ~init:([], Stake_repr.zero) diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index f4acbc0d6f1a..af66466df74a 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -42,6 +42,10 @@ let apply_slashing ~percentage {own_frozen; staked_frozen; delegated} = in {own_frozen; staked_frozen; delegated} +let has_minimal_frozen_stake ~minimal_frozen_stake + {own_frozen; staked_frozen = _; delegated = _} = + Tez_repr.(own_frozen >= minimal_frozen_stake) + let remove_delegated ~amount {own_frozen; staked_frozen; delegated} = let open Result_syntax in let+ delegated = Tez_repr.(delegated -? amount) in diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index 74e834ad75e7..6b4f52841457 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -21,6 +21,8 @@ val voting_weight : t -> Int64.t tzresult val apply_slashing : percentage:Int_percentage.t -> t -> t +val has_minimal_frozen_stake : minimal_frozen_stake:Tez_repr.t -> t -> bool + val remove_delegated : amount:Tez_repr.t -> t -> t tzresult val remove_own_frozen : amount:Tez_repr.t -> t -> t tzresult -- GitLab From 5b7758622bc50d40fdfddace5199f2492aabb6f9 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 30 Nov 2023 11:11:58 +0100 Subject: [PATCH 4/8] Proto/Delegate_sampler: re-check minimal stake after applying limits and edge --- src/proto_alpha/lib_protocol/delegate_sampler.ml | 4 ++-- src/proto_alpha/lib_protocol/stake_repr.ml | 5 +++++ src/proto_alpha/lib_protocol/stake_repr.mli | 2 ++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index ac2caa823647..39537e1bffa7 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -169,6 +169,7 @@ let get_delegate_stake_from_staking_balance ctxt delegate staking_balance = let get_stakes_for_selected_index ctxt ~slashings index = let open Lwt_result_syntax in let minimal_frozen_stake = Constants_storage.minimal_frozen_stake ctxt in + let minimal_stake = Constants_storage.minimal_stake ctxt in Stake_storage.fold_snapshot ctxt ~index @@ -187,8 +188,7 @@ let get_stakes_for_selected_index ctxt ~slashings index = let* stake_for_cycle = get_delegate_stake_from_staking_balance ctxt delegate staking_balance in - if Stake_storage.has_minimal_stake_and_frozen_stake ctxt staking_balance - then + if Stake_repr.has_minimal_stake ~minimal_stake stake_for_cycle then let stakes, total_stake = acc in let*? total_stake = Stake_repr.(total_stake +? stake_for_cycle) in return ((delegate, stake_for_cycle) :: stakes, total_stake) diff --git a/src/proto_alpha/lib_protocol/stake_repr.ml b/src/proto_alpha/lib_protocol/stake_repr.ml index b5da168279a6..196354314010 100644 --- a/src/proto_alpha/lib_protocol/stake_repr.ml +++ b/src/proto_alpha/lib_protocol/stake_repr.ml @@ -51,3 +51,8 @@ let staking_weight {frozen; weighted_delegated} = Int64.add frozen weighted_delegated let compare s1 s2 = Int64.compare (staking_weight s1) (staking_weight s2) + +let has_minimal_stake ~minimal_stake {frozen; weighted_delegated} = + match Tez_repr.(frozen +? weighted_delegated) with + | Error _total_overflows -> true + | Ok total -> Tez_repr.(total >= minimal_stake) diff --git a/src/proto_alpha/lib_protocol/stake_repr.mli b/src/proto_alpha/lib_protocol/stake_repr.mli index e7f58ea9c875..8e9be23fa570 100644 --- a/src/proto_alpha/lib_protocol/stake_repr.mli +++ b/src/proto_alpha/lib_protocol/stake_repr.mli @@ -43,3 +43,5 @@ val ( +? ) : t -> t -> t tzresult val staking_weight : t -> int64 val compare : t -> t -> int + +val has_minimal_stake : minimal_stake:Tez_repr.t -> t -> bool -- GitLab From cb0fd12db296a7feb27b48569fbc113ca616e9fc Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 30 Nov 2023 11:13:01 +0100 Subject: [PATCH 5/8] Proto/Stake_storage: remove now dead has_minimal_stake_and_frozen_stake --- src/proto_alpha/lib_protocol/stake_storage.ml | 6 ------ src/proto_alpha/lib_protocol/stake_storage.mli | 3 --- 2 files changed, 9 deletions(-) diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 88981849da4f..1a1711f4fccd 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -89,12 +89,6 @@ let has_minimal_stake ctxt true (* If the sum overflows, we are definitely over the minimal stake. *) | Ok staking_balance -> Tez_repr.(staking_balance >= minimal_stake) -let has_minimal_stake_and_frozen_stake ctxt - ({own_frozen; _} as full_staking_balance : Full_staking_balance_repr.t) = - let minimal_frozen_stake = Constants_storage.minimal_frozen_stake ctxt in - Tez_repr.(own_frozen >= minimal_frozen_stake) - && has_minimal_stake ctxt full_staking_balance - let initialize_delegate ctxt delegate ~delegated = let open Lwt_result_syntax in let balance = diff --git a/src/proto_alpha/lib_protocol/stake_storage.mli b/src/proto_alpha/lib_protocol/stake_storage.mli index 440aa77b7761..7fecdcf9871b 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.mli +++ b/src/proto_alpha/lib_protocol/stake_storage.mli @@ -45,9 +45,6 @@ val get_full_staking_balance : Signature.public_key_hash -> Full_staking_balance_repr.t tzresult Lwt.t -val has_minimal_stake_and_frozen_stake : - Raw_context.t -> Full_staking_balance_repr.t -> bool - val remove_delegated_stake : Raw_context.t -> Signature.Public_key_hash.t -> -- GitLab From 1335f33b443997dcb99aabd507dee5445b47e45b Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 12 Oct 2023 18:33:03 +0200 Subject: [PATCH 6/8] Proto/Full_staking_balance_repr: make it abstract --- .../lib_protocol/delegate_cycles.ml | 6 ++-- .../lib_protocol/delegate_storage.ml | 5 ++-- .../lib_protocol/full_staking_balance_repr.ml | 29 +++++++++++++++++++ .../full_staking_balance_repr.mli | 25 ++++++++++++---- src/proto_alpha/lib_protocol/shared_stake.ml | 26 +++++------------ src/proto_alpha/lib_protocol/stake_context.ml | 11 ++++--- src/proto_alpha/lib_protocol/stake_storage.ml | 22 +++----------- .../staking_pseudotokens_storage.ml | 12 +++----- 8 files changed, 78 insertions(+), 58 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_cycles.ml b/src/proto_alpha/lib_protocol/delegate_cycles.ml index 6ec818139def..94510caa4530 100644 --- a/src/proto_alpha/lib_protocol/delegate_cycles.ml +++ b/src/proto_alpha/lib_protocol/delegate_cycles.ml @@ -126,10 +126,12 @@ let adjust_frozen_stakes ctxt ~deactivated_delegates : ~order:`Undefined ~init:(ctxt, []) ~f:(fun delegate (ctxt, balance_updates) -> - let* ({own_frozen; _} as full_staking_balance : - Full_staking_balance_repr.t) = + let* full_staking_balance = Stake_storage.get_full_staking_balance ctxt delegate in + let own_frozen = + Full_staking_balance_repr.own_frozen full_staking_balance + in let*? optimal_frozen = Stake_context.optimal_frozen_wrt_delegated_without_ai ctxt diff --git a/src/proto_alpha/lib_protocol/delegate_storage.ml b/src/proto_alpha/lib_protocol/delegate_storage.ml index 04ee724eba8d..b58808258454 100644 --- a/src/proto_alpha/lib_protocol/delegate_storage.ml +++ b/src/proto_alpha/lib_protocol/delegate_storage.ml @@ -286,11 +286,10 @@ let initial_frozen_deposits_of_previous_cycle ctxt delegate = let current_frozen_deposits ctxt delegate = let open Lwt_result_syntax in - let* {own_frozen; staked_frozen; delegated = _} = + let* full_staking_balance = Stake_storage.get_full_staking_balance ctxt delegate in - let*? total = Tez_repr.(own_frozen +? staked_frozen) in - return total + Lwt.return (Full_staking_balance_repr.total_frozen full_staking_balance) let frozen_deposits_limit ctxt delegate = Storage.Contract.Frozen_deposits_limit.find diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index af66466df74a..dc12ccb9561f 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -42,10 +42,39 @@ let apply_slashing ~percentage {own_frozen; staked_frozen; delegated} = in {own_frozen; staked_frozen; delegated} +let own_frozen {own_frozen; staked_frozen = _; delegated = _} = own_frozen + +let staked_frozen {own_frozen = _; staked_frozen; delegated = _} = staked_frozen + +let total_frozen {own_frozen; staked_frozen; delegated = _} = + Tez_repr.(own_frozen +? staked_frozen) + +let delegated {own_frozen = _; staked_frozen = _; delegated} = delegated + +let total {own_frozen; staked_frozen; delegated} = + let open Result_syntax in + let* total_frozen = Tez_repr.(own_frozen +? staked_frozen) in + Tez_repr.(total_frozen +? delegated) + +let own_ratio {own_frozen; staked_frozen; delegated = _} = + if Tez_repr.(staked_frozen = zero) then (1L, 1L) + else if Tez_repr.(own_frozen = zero) then (0L, 1L) + else + let own_frozen = Tez_repr.to_mutez own_frozen in + let staked_frozen = Tez_repr.to_mutez staked_frozen in + (own_frozen, Int64.add own_frozen staked_frozen) + let has_minimal_frozen_stake ~minimal_frozen_stake {own_frozen; staked_frozen = _; delegated = _} = Tez_repr.(own_frozen >= minimal_frozen_stake) +let has_minimal_stake ~minimal_stake full_staking_balance = + match total full_staking_balance with + | Error _total_overflows -> + true + (* If the total overflows, we are definitely over the minimal stake. *) + | Ok staking_balance -> Tez_repr.(staking_balance >= minimal_stake) + let remove_delegated ~amount {own_frozen; staked_frozen; delegated} = let open Result_syntax in let+ delegated = Tez_repr.(delegated -? amount) in diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index 6b4f52841457..1ee9e08a07b6 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -5,11 +5,7 @@ (* *) (*****************************************************************************) -type t = private { - own_frozen : Tez_repr.t; - staked_frozen : Tez_repr.t; - delegated : Tez_repr.t; -} +type t val init : own_frozen:Tez_repr.t -> staked_frozen:Tez_repr.t -> delegated:Tez_repr.t -> t @@ -21,8 +17,27 @@ val voting_weight : t -> Int64.t tzresult val apply_slashing : percentage:Int_percentage.t -> t -> t +val own_frozen : t -> Tez_repr.t + +val staked_frozen : t -> Tez_repr.t + +val delegated : t -> Tez_repr.t + +(** Sum of [own_frozen] and [staked_frozen]. *) +val total_frozen : t -> Tez_repr.t tzresult + +(** Sum of [own_frozen], [staked_frozen], and [delegated]. *) +val total : t -> Tez_repr.t tzresult + +(** [own_ratio full_staking_balance] returns [(num, den)] representing the +ratio of [own_frozen] over [total_frozen] for [full_staking_balance]. +If [total_frozen] is zero, the returned ratio is [(1L, 1L)]. *) +val own_ratio : t -> Int64.t * Int64.t + val has_minimal_frozen_stake : minimal_frozen_stake:Tez_repr.t -> t -> bool +val has_minimal_stake : minimal_stake:Tez_repr.t -> t -> bool + val remove_delegated : amount:Tez_repr.t -> t -> t tzresult val remove_own_frozen : amount:Tez_repr.t -> t -> t tzresult diff --git a/src/proto_alpha/lib_protocol/shared_stake.ml b/src/proto_alpha/lib_protocol/shared_stake.ml index 6a855e8590b6..5164e4a391df 100644 --- a/src/proto_alpha/lib_protocol/shared_stake.ml +++ b/src/proto_alpha/lib_protocol/shared_stake.ml @@ -9,25 +9,15 @@ type shared = {baker_part : Tez_repr.t; stakers_part : Tez_repr.t} let share ~rounding ~full_staking_balance amount = let open Result_syntax in - let Full_staking_balance_repr.{own_frozen; staked_frozen; delegated = _} = - full_staking_balance - in - if Tez_repr.(staked_frozen = zero) then - return {baker_part = amount; stakers_part = Tez_repr.zero} - else - let* total_frozen = Tez_repr.(own_frozen +? staked_frozen) in - let* baker_part = - let rounding = - match rounding with `Towards_stakers -> `Down | `Towards_baker -> `Up - in - Tez_repr.mul_ratio - ~rounding - amount - ~num:(Tez_repr.to_mutez own_frozen) - ~den:(Tez_repr.to_mutez total_frozen) + let num, den = Full_staking_balance_repr.own_ratio full_staking_balance in + let* baker_part = + let rounding = + match rounding with `Towards_stakers -> `Down | `Towards_baker -> `Up in - let* stakers_part = Tez_repr.(amount -? baker_part) in - return {baker_part; stakers_part} + Tez_repr.mul_ratio ~rounding amount ~num ~den + in + let* stakers_part = Tez_repr.(amount -? baker_part) in + return {baker_part; stakers_part} type reward_distrib = { to_baker_from_staking : Tez_repr.t; diff --git a/src/proto_alpha/lib_protocol/stake_context.ml b/src/proto_alpha/lib_protocol/stake_context.ml index 44114a327c01..4cbe0b84c198 100644 --- a/src/proto_alpha/lib_protocol/stake_context.ml +++ b/src/proto_alpha/lib_protocol/stake_context.ml @@ -23,9 +23,11 @@ (* *) (*****************************************************************************) -let apply_limits ctxt staking_parameters - {Full_staking_balance_repr.own_frozen; staked_frozen; delegated} = +let apply_limits ctxt staking_parameters staking_balance = let open Result_syntax in + let own_frozen = Full_staking_balance_repr.own_frozen staking_balance in + let staked_frozen = Full_staking_balance_repr.staked_frozen staking_balance in + let delegated = Full_staking_balance_repr.delegated staking_balance in let limit_of_delegation_over_baking = Int64.of_int (Constants_storage.limit_of_delegation_over_baking ctxt) in @@ -83,8 +85,7 @@ let apply_limits ctxt staking_parameters let+ frozen = Tez_repr.(own_frozen +? allowed_staked_frozen) in Stake_repr.make ~frozen ~weighted_delegated -let optimal_frozen_wrt_delegated_without_ai ctxt - {Full_staking_balance_repr.delegated; own_frozen; _} = +let optimal_frozen_wrt_delegated_without_ai ctxt full_staking_balance = let open Result_syntax in let limit_of_delegation_over_baking = Int64.of_int (Constants_storage.limit_of_delegation_over_baking ctxt) @@ -96,6 +97,8 @@ let optimal_frozen_wrt_delegated_without_ai ctxt With AI the optimum is to freeze as much as possible, this computation would make no sense. *) + let delegated = Full_staking_balance_repr.delegated full_staking_balance in + let own_frozen = Full_staking_balance_repr.own_frozen full_staking_balance in let* power = Tez_repr.(delegated +? own_frozen) in let* opti_frozen = Tez_repr.mul_ratio diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 1a1711f4fccd..c6fb8e9abcd6 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -75,19 +75,9 @@ end let get_full_staking_balance = Storage.Stake.Staking_balance.get -let has_minimal_stake ctxt - {Full_staking_balance_repr.own_frozen; staked_frozen; delegated} = - let open Result_syntax in - let open Tez_repr in +let has_minimal_stake ctxt staking_balance = let minimal_stake = Constants_storage.minimal_stake ctxt in - let sum = - let* frozen = own_frozen +? staked_frozen in - frozen +? delegated - in - match sum with - | Error _sum_overflows -> - true (* If the sum overflows, we are definitely over the minimal stake. *) - | Ok staking_balance -> Tez_repr.(staking_balance >= minimal_stake) + Full_staking_balance_repr.has_minimal_stake ~minimal_stake staking_balance let initialize_delegate ctxt delegate ~delegated = let open Lwt_result_syntax in @@ -297,12 +287,8 @@ let add_contract_delegated_stake ctxt contract amount = module For_RPC = struct let get_staking_balance ctxt delegate = let open Lwt_result_syntax in - let* {own_frozen; staked_frozen; delegated} = - Storage.Stake.Staking_balance.get ctxt delegate - in - let*? frozen = Tez_repr.(own_frozen +? staked_frozen) in - let*? staking_balance = Tez_repr.(frozen +? delegated) in - return staking_balance + let* staking_balance = Storage.Stake.Staking_balance.get ctxt delegate in + Lwt.return (Full_staking_balance_repr.total staking_balance) end module Internal_for_tests = struct diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml index 9af3dedf02c0..75a02fbbfdff 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml @@ -156,17 +156,13 @@ type delegator_balances = { deposits, in tez, of the delegate's stakers. *) let get_frozen_deposits_staked_tez ctxt ~delegate = let open Lwt_result_syntax in - let+ {staked_frozen; delegated = _; own_frozen = _} = - Stake_storage.get_full_staking_balance ctxt delegate - in - staked_frozen + let+ staking_balance = Stake_storage.get_full_staking_balance ctxt delegate in + Full_staking_balance_repr.staked_frozen staking_balance let get_own_frozen_deposits ctxt ~delegate = let open Lwt_result_syntax in - let+ {own_frozen; delegated = _; staked_frozen = _} = - Stake_storage.get_full_staking_balance ctxt delegate - in - own_frozen + let+ staking_balance = Stake_storage.get_full_staking_balance ctxt delegate in + Full_staking_balance_repr.own_frozen staking_balance (** [get_frozen_deposits_pseudotokens ctxt ~delegate] returns the total number of pseudotokens in circulation for the given -- GitLab From 73e9a8782fe41cbc1e56b9245a6411979bb8c561 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 18 Dec 2023 15:39:24 +0100 Subject: [PATCH 7/8] Proto/Full_staking_balance_repr: rename has_minimal_stake --- src/proto_alpha/lib_protocol/full_staking_balance_repr.ml | 2 +- src/proto_alpha/lib_protocol/full_staking_balance_repr.mli | 2 +- src/proto_alpha/lib_protocol/stake_storage.ml | 4 +++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml index dc12ccb9561f..f697fecbd933 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.ml @@ -68,7 +68,7 @@ let has_minimal_frozen_stake ~minimal_frozen_stake {own_frozen; staked_frozen = _; delegated = _} = Tez_repr.(own_frozen >= minimal_frozen_stake) -let has_minimal_stake ~minimal_stake full_staking_balance = +let has_minimal_stake_to_be_considered ~minimal_stake full_staking_balance = match total full_staking_balance with | Error _total_overflows -> true diff --git a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli index 1ee9e08a07b6..ac49289e14a3 100644 --- a/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli +++ b/src/proto_alpha/lib_protocol/full_staking_balance_repr.mli @@ -36,7 +36,7 @@ val own_ratio : t -> Int64.t * Int64.t val has_minimal_frozen_stake : minimal_frozen_stake:Tez_repr.t -> t -> bool -val has_minimal_stake : minimal_stake:Tez_repr.t -> t -> bool +val has_minimal_stake_to_be_considered : minimal_stake:Tez_repr.t -> t -> bool val remove_delegated : amount:Tez_repr.t -> t -> t tzresult diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index c6fb8e9abcd6..8ecb2d81188d 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -77,7 +77,9 @@ let get_full_staking_balance = Storage.Stake.Staking_balance.get let has_minimal_stake ctxt staking_balance = let minimal_stake = Constants_storage.minimal_stake ctxt in - Full_staking_balance_repr.has_minimal_stake ~minimal_stake staking_balance + Full_staking_balance_repr.has_minimal_stake_to_be_considered + ~minimal_stake + staking_balance let initialize_delegate ctxt delegate ~delegated = let open Lwt_result_syntax in -- GitLab From 7fef6ff618694997f5c08c13cdc097147d406e6e Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Mon, 18 Dec 2023 15:40:43 +0100 Subject: [PATCH 8/8] Proto/Stake_repr: rename has_minimal_stake --- src/proto_alpha/lib_protocol/delegate_sampler.ml | 6 +++++- src/proto_alpha/lib_protocol/stake_repr.ml | 3 ++- src/proto_alpha/lib_protocol/stake_repr.mli | 2 +- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/proto_alpha/lib_protocol/delegate_sampler.ml b/src/proto_alpha/lib_protocol/delegate_sampler.ml index 39537e1bffa7..5f11a87febef 100644 --- a/src/proto_alpha/lib_protocol/delegate_sampler.ml +++ b/src/proto_alpha/lib_protocol/delegate_sampler.ml @@ -188,7 +188,11 @@ let get_stakes_for_selected_index ctxt ~slashings index = let* stake_for_cycle = get_delegate_stake_from_staking_balance ctxt delegate staking_balance in - if Stake_repr.has_minimal_stake ~minimal_stake stake_for_cycle then + if + Stake_repr.has_minimal_stake_to_participate + ~minimal_stake + stake_for_cycle + then let stakes, total_stake = acc in let*? total_stake = Stake_repr.(total_stake +? stake_for_cycle) in return ((delegate, stake_for_cycle) :: stakes, total_stake) diff --git a/src/proto_alpha/lib_protocol/stake_repr.ml b/src/proto_alpha/lib_protocol/stake_repr.ml index 196354314010..8dd7364b79fb 100644 --- a/src/proto_alpha/lib_protocol/stake_repr.ml +++ b/src/proto_alpha/lib_protocol/stake_repr.ml @@ -52,7 +52,8 @@ let staking_weight {frozen; weighted_delegated} = let compare s1 s2 = Int64.compare (staking_weight s1) (staking_weight s2) -let has_minimal_stake ~minimal_stake {frozen; weighted_delegated} = +let has_minimal_stake_to_participate ~minimal_stake {frozen; weighted_delegated} + = match Tez_repr.(frozen +? weighted_delegated) with | Error _total_overflows -> true | Ok total -> Tez_repr.(total >= minimal_stake) diff --git a/src/proto_alpha/lib_protocol/stake_repr.mli b/src/proto_alpha/lib_protocol/stake_repr.mli index 8e9be23fa570..b136f0e0a0c4 100644 --- a/src/proto_alpha/lib_protocol/stake_repr.mli +++ b/src/proto_alpha/lib_protocol/stake_repr.mli @@ -44,4 +44,4 @@ val staking_weight : t -> int64 val compare : t -> t -> int -val has_minimal_stake : minimal_stake:Tez_repr.t -> t -> bool +val has_minimal_stake_to_participate : minimal_stake:Tez_repr.t -> t -> bool -- GitLab