From 480d4a2dddae155af10630554b71e7d87d665623 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Jun 2023 09:11:28 +0200 Subject: [PATCH 01/10] Proto: add module Staking_pseudotoken_repr --- src/proto_alpha/lib_protocol/TEZOS_PROTOCOL | 1 + src/proto_alpha/lib_protocol/dune | 4 ++++ .../lib_protocol/staking_pseudotoken_repr.ml | 24 +++++++++++++++++++ .../lib_protocol/staking_pseudotoken_repr.mli | 24 +++++++++++++++++++ 4 files changed, 53 insertions(+) create mode 100644 src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml create mode 100644 src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli diff --git a/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL b/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL index 30dd8f454a61..e86c1fbd3168 100644 --- a/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL +++ b/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL @@ -25,6 +25,7 @@ "Slot_repr", "Tez_repr", "Deposits_repr", + "Staking_pseudotoken_repr", "Period_repr", "Time_repr", "Ratio_repr", diff --git a/src/proto_alpha/lib_protocol/dune b/src/proto_alpha/lib_protocol/dune index 268d476696ec..d4f44b0fee57 100644 --- a/src/proto_alpha/lib_protocol/dune +++ b/src/proto_alpha/lib_protocol/dune @@ -53,6 +53,7 @@ Slot_repr Tez_repr Deposits_repr + Staking_pseudotoken_repr Period_repr Time_repr Ratio_repr @@ -315,6 +316,7 @@ slot_repr.ml slot_repr.mli tez_repr.ml tez_repr.mli deposits_repr.ml deposits_repr.mli + staking_pseudotoken_repr.ml staking_pseudotoken_repr.mli period_repr.ml period_repr.mli time_repr.ml time_repr.mli ratio_repr.ml ratio_repr.mli @@ -582,6 +584,7 @@ slot_repr.ml slot_repr.mli tez_repr.ml tez_repr.mli deposits_repr.ml deposits_repr.mli + staking_pseudotoken_repr.ml staking_pseudotoken_repr.mli period_repr.ml period_repr.mli time_repr.ml time_repr.mli ratio_repr.ml ratio_repr.mli @@ -833,6 +836,7 @@ slot_repr.ml slot_repr.mli tez_repr.ml tez_repr.mli deposits_repr.ml deposits_repr.mli + staking_pseudotoken_repr.ml staking_pseudotoken_repr.mli period_repr.ml period_repr.mli time_repr.ml time_repr.mli ratio_repr.ml ratio_repr.mli diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml new file mode 100644 index 000000000000..a2b94f066c32 --- /dev/null +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml @@ -0,0 +1,24 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2023 Nomadic Labs *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli new file mode 100644 index 000000000000..a2b94f066c32 --- /dev/null +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli @@ -0,0 +1,24 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2023 Nomadic Labs *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) -- GitLab From 0b0b893d5664513c4ede40875abec0c302ad8008 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Jun 2023 09:33:54 +0200 Subject: [PATCH 02/10] Proto/Staking_pseudotoken_repr: reuse Tez_repr --- src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml | 4 ++++ src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml index a2b94f066c32..6327d5857d4b 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml @@ -22,3 +22,7 @@ (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) + +(* A pseudotoken is not a Tez but it behaves similarly so let's reuse its operations. *) + +include Tez_repr diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli index a2b94f066c32..efb2397632d3 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli @@ -22,3 +22,9 @@ (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) + +(** Pseudotoken used in staking. + It represents a share of the total frozen deposits of a baker. *) +type t + +val encoding : t Data_encoding.t -- GitLab From 8659902955ef35057e3738fffbaf7541ad779ab1 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Jun 2023 10:03:12 +0200 Subject: [PATCH 03/10] Proto/Storage: add Frozen_deposits_pseudotokens --- src/proto_alpha/lib_protocol/storage.ml | 8 ++++++++ src/proto_alpha/lib_protocol/storage.mli | 8 ++++++++ 2 files changed, 16 insertions(+) diff --git a/src/proto_alpha/lib_protocol/storage.ml b/src/proto_alpha/lib_protocol/storage.ml index b83708463c71..477049017f68 100644 --- a/src/proto_alpha/lib_protocol/storage.ml +++ b/src/proto_alpha/lib_protocol/storage.ml @@ -436,6 +436,14 @@ module Contract = struct end) (Unstake_request) + module Frozen_deposits_pseudotokens = + Indexed_context.Make_map + (Registered) + (struct + let name = ["frozen_deposits_pseudotokens"] + end) + (Staking_pseudotoken_repr) + module Frozen_deposits_limit = Indexed_context.Make_map (Registered) diff --git a/src/proto_alpha/lib_protocol/storage.mli b/src/proto_alpha/lib_protocol/storage.mli index 3e909bce87bb..a077371d0c20 100644 --- a/src/proto_alpha/lib_protocol/storage.mli +++ b/src/proto_alpha/lib_protocol/storage.mli @@ -197,6 +197,14 @@ module Contract : sig and type value = Unstake_request.t and type t := Raw_context.t + (** The sum of all pseudotokens owned by costakers (the delegate included) + corresponding to shares of the {!Frozen_deposits} current amount. *) + module Frozen_deposits_pseudotokens : + Indexed_data_storage + with type key = Contract_repr.t + and type value = Staking_pseudotoken_repr.t + and type t := Raw_context.t + (** If there is a value, the frozen balance for the contract won't exceed it (starting in preserved_cycles + 1). *) module Frozen_deposits_limit : -- GitLab From 530f5c938b24fd8fe0ee1f5f013c556469d76b76 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Thu, 1 Jun 2023 10:23:11 +0200 Subject: [PATCH 04/10] Proto/Storage: add Costaking_pseudotokens --- src/proto_alpha/lib_protocol/storage.ml | 8 ++++++++ src/proto_alpha/lib_protocol/storage.mli | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/src/proto_alpha/lib_protocol/storage.ml b/src/proto_alpha/lib_protocol/storage.ml index 477049017f68..ff6c3b966122 100644 --- a/src/proto_alpha/lib_protocol/storage.ml +++ b/src/proto_alpha/lib_protocol/storage.ml @@ -444,6 +444,14 @@ module Contract = struct end) (Staking_pseudotoken_repr) + module Costaking_pseudotokens = + Indexed_context.Make_map + (Registered) + (struct + let name = ["costaking_pseudotokens"] + end) + (Staking_pseudotoken_repr) + module Frozen_deposits_limit = Indexed_context.Make_map (Registered) diff --git a/src/proto_alpha/lib_protocol/storage.mli b/src/proto_alpha/lib_protocol/storage.mli index a077371d0c20..764545e67faa 100644 --- a/src/proto_alpha/lib_protocol/storage.mli +++ b/src/proto_alpha/lib_protocol/storage.mli @@ -205,6 +205,13 @@ module Contract : sig and type value = Staking_pseudotoken_repr.t and type t := Raw_context.t + (** Share of the contract's delegate frozen deposits the contract owns. *) + module Costaking_pseudotokens : + Indexed_data_storage + with type key = Contract_repr.t + and type value = Staking_pseudotoken_repr.t + and type t := Raw_context.t + (** If there is a value, the frozen balance for the contract won't exceed it (starting in preserved_cycles + 1). *) module Frozen_deposits_limit : -- GitLab From e1ae4c050635168aa977acf1b4b4dbcaf3547ba6 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 16:43:57 +0200 Subject: [PATCH 05/10] Proto: add module staking_pseudotokens_storage --- src/proto_alpha/lib_protocol/TEZOS_PROTOCOL | 1 + src/proto_alpha/lib_protocol/dune | 4 +++ .../staking_pseudotokens_storage.ml | 24 ++++++++++++++++ .../staking_pseudotokens_storage.mli | 28 +++++++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml create mode 100644 src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli diff --git a/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL b/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL index e86c1fbd3168..967a974461a9 100644 --- a/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL +++ b/src/proto_alpha/lib_protocol/TEZOS_PROTOCOL @@ -139,6 +139,7 @@ "Unstaked_frozen_deposits_storage", "Unstake_requests_storage", "Frozen_deposits_storage", + "Staking_pseudotokens_storage", "Contract_storage", "Token", "Fees_storage", diff --git a/src/proto_alpha/lib_protocol/dune b/src/proto_alpha/lib_protocol/dune index d4f44b0fee57..68b91814b853 100644 --- a/src/proto_alpha/lib_protocol/dune +++ b/src/proto_alpha/lib_protocol/dune @@ -157,6 +157,7 @@ Unstaked_frozen_deposits_storage Unstake_requests_storage Frozen_deposits_storage + Staking_pseudotokens_storage Contract_storage Token Fees_storage @@ -423,6 +424,7 @@ unstaked_frozen_deposits_storage.ml unstaked_frozen_deposits_storage.mli unstake_requests_storage.ml unstake_requests_storage.mli frozen_deposits_storage.ml frozen_deposits_storage.mli + staking_pseudotokens_storage.ml staking_pseudotokens_storage.mli contract_storage.ml contract_storage.mli token.ml token.mli fees_storage.ml fees_storage.mli @@ -691,6 +693,7 @@ unstaked_frozen_deposits_storage.ml unstaked_frozen_deposits_storage.mli unstake_requests_storage.ml unstake_requests_storage.mli frozen_deposits_storage.ml frozen_deposits_storage.mli + staking_pseudotokens_storage.ml staking_pseudotokens_storage.mli contract_storage.ml contract_storage.mli token.ml token.mli fees_storage.ml fees_storage.mli @@ -943,6 +946,7 @@ unstaked_frozen_deposits_storage.ml unstaked_frozen_deposits_storage.mli unstake_requests_storage.ml unstake_requests_storage.mli frozen_deposits_storage.ml frozen_deposits_storage.mli + staking_pseudotokens_storage.ml staking_pseudotokens_storage.mli contract_storage.ml contract_storage.mli token.ml token.mli fees_storage.ml fees_storage.mli diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml new file mode 100644 index 000000000000..a2b94f066c32 --- /dev/null +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml @@ -0,0 +1,24 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2023 Nomadic Labs *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli new file mode 100644 index 000000000000..dce1121e677b --- /dev/null +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli @@ -0,0 +1,28 @@ +(*****************************************************************************) +(* *) +(* Open Source License *) +(* Copyright (c) 2023 Nomadic Labs *) +(* *) +(* Permission is hereby granted, free of charge, to any person obtaining a *) +(* copy of this software and associated documentation files (the "Software"),*) +(* to deal in the Software without restriction, including without limitation *) +(* the rights to use, copy, modify, merge, publish, distribute, sublicense, *) +(* and/or sell copies of the Software, and to permit persons to whom the *) +(* Software is furnished to do so, subject to the following conditions: *) +(* *) +(* The above copyright notice and this permission notice shall be included *) +(* in all copies or substantial portions of the Software. *) +(* *) +(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*) +(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, *) +(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL *) +(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*) +(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING *) +(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER *) +(* DEALINGS IN THE SOFTWARE. *) +(* *) +(*****************************************************************************) + +(** This module is responsible for maintaining the + {!Storage.Contract.Frozen_deposits_pseudotokens} and + {!Storage.Contract.Costaking_pseudotokens} tables. *) -- GitLab From 8efdec1485bf1e6531516317b087557118e822ac Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 17:48:50 +0200 Subject: [PATCH 06/10] Proto/Staking_pseudotokens_storage: credit_frozen_deposits_pseudotokens_for_tez_amount --- .../lib_protocol/staking_pseudotoken_repr.ml | 4 ++ .../lib_protocol/staking_pseudotoken_repr.mli | 8 +++ .../staking_pseudotokens_storage.ml | 60 +++++++++++++++++++ .../staking_pseudotokens_storage.mli | 11 ++++ 4 files changed, 83 insertions(+) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml index 6327d5857d4b..5ed0def69891 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.ml @@ -26,3 +26,7 @@ (* A pseudotoken is not a Tez but it behaves similarly so let's reuse its operations. *) include Tez_repr + +let of_int64_exn = of_mutez_exn + +let to_int64 = to_mutez diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli index efb2397632d3..225a6dc402c6 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli @@ -28,3 +28,11 @@ type t val encoding : t Data_encoding.t + +val of_int64_exn : int64 -> t + +val to_int64 : t -> int64 + +val ( = ) : t -> t -> bool + +val ( +? ) : t -> t -> t tzresult diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml index a2b94f066c32..eb0c3db6e1ea 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml @@ -22,3 +22,63 @@ (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) + +let pseudotokens_of ~frozen_deposits_pseudotokens ~frozen_deposits_tez + ~tez_amount = + if Tez_repr.(frozen_deposits_tez = zero) then ( + (* When there are no frozen deposits, starts with 1 pseudotoken = 1 mutez. *) + assert (Staking_pseudotoken_repr.(frozen_deposits_pseudotokens = zero)) ; + Staking_pseudotoken_repr.of_int64_exn (Tez_repr.to_mutez tez_amount)) + else + let frozen_deposits_tez_z = + Z.of_int64 (Tez_repr.to_mutez frozen_deposits_tez) + in + let frozen_deposits_pseudotokens_z = + Z.of_int64 + (Staking_pseudotoken_repr.to_int64 frozen_deposits_pseudotokens) + in + let tez_amount_z = Z.of_int64 (Tez_repr.to_mutez tez_amount) in + let res_z = + Z.div + (Z.mul tez_amount_z frozen_deposits_pseudotokens_z) + frozen_deposits_tez_z + in + Staking_pseudotoken_repr.of_int64_exn (Z.to_int64 res_z) + +let update_frozen_deposits_pseudotokens ~f ctxt delegate = + let open Lwt_result_syntax in + let contract = Contract_repr.Implicit delegate in + let* {current_amount = frozen_deposits_tez; initial_amount = _} = + Frozen_deposits_storage.get ctxt contract + in + let* frozen_deposits_pseudotokens = + Storage.Contract.Frozen_deposits_pseudotokens.get ctxt contract + in + let*? new_frozen_deposits_pseudotokens, x = + f ~frozen_deposits_pseudotokens ~frozen_deposits_tez + in + let+ ctxt = + Storage.Contract.Frozen_deposits_pseudotokens.update + ctxt + contract + new_frozen_deposits_pseudotokens + in + (ctxt, x) + +let credit_frozen_deposits_pseudotokens_for_tez_amount ctxt delegate tez_amount + = + let f ~frozen_deposits_pseudotokens ~frozen_deposits_tez = + let open Result_syntax in + let pseudotokens_to_add = + pseudotokens_of + ~frozen_deposits_pseudotokens + ~frozen_deposits_tez + ~tez_amount + in + let+ new_pseudotokens_balance = + Staking_pseudotoken_repr.( + pseudotokens_to_add +? frozen_deposits_pseudotokens) + in + (new_pseudotokens_balance, pseudotokens_to_add) + in + update_frozen_deposits_pseudotokens ~f ctxt delegate diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli index dce1121e677b..d0ecc5e8083c 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli @@ -26,3 +26,14 @@ (** This module is responsible for maintaining the {!Storage.Contract.Frozen_deposits_pseudotokens} and {!Storage.Contract.Costaking_pseudotokens} tables. *) + +(** [credit_frozen_deposits_pseudotokens_for_tez_amount ctxt delegate tez_amount] + increases [delegate]'s stake pseudotokens by an amount [pa] corresponding to + [tez_amount] multiplied by the current rate of the delegate's frozen + deposits pseudotokens per tez. + The function also returns [pa]. *) +val credit_frozen_deposits_pseudotokens_for_tez_amount : + Raw_context.t -> + Signature.Public_key_hash.t -> + Tez_repr.t -> + (Raw_context.t * Staking_pseudotoken_repr.t) tzresult Lwt.t -- GitLab From 12062f9ad4760e4fbd3901c3486e641ec8b93114 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 18:11:15 +0200 Subject: [PATCH 07/10] Proto/Staking: credit pseudotokens on stake --- src/proto_alpha/lib_protocol/alpha_context.ml | 5 +++++ src/proto_alpha/lib_protocol/alpha_context.mli | 9 +++++++++ src/proto_alpha/lib_protocol/staking.ml | 6 ++++++ .../lib_protocol/staking_pseudotokens_storage.mli | 5 ++++- 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.ml b/src/proto_alpha/lib_protocol/alpha_context.ml index 04b75aef3703..844c28b7439f 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.ml +++ b/src/proto_alpha/lib_protocol/alpha_context.ml @@ -626,6 +626,11 @@ module Token = Token module Cache = Cache_repr module Unstake_requests = Unstake_requests_storage +module Staking_pseudotokens = struct + include Staking_pseudotoken_repr + include Staking_pseudotokens_storage +end + module Internal_for_tests = struct let to_raw x = x end diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index b8e035e4db64..6c4dffa1beea 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -4892,6 +4892,15 @@ module Unstake_requests : sig context -> Contract.t -> stored_requests -> context tzresult Lwt.t end +(** This module re-exports definitions from {!Staking_pseudotoken_repr} and + {!Staking_pseudotokens_storage}. *) +module Staking_pseudotokens : sig + type t + + val credit_frozen_deposits_pseudotokens_for_tez_amount : + context -> public_key_hash -> Tez.t -> (context * t) tzresult Lwt.t +end + (** This module re-exports definitions from {!Fees_storage}. *) module Fees : sig val record_paid_storage_space : diff --git a/src/proto_alpha/lib_protocol/staking.ml b/src/proto_alpha/lib_protocol/staking.ml index f87d5ffc59ca..45fbc2a03c7d 100644 --- a/src/proto_alpha/lib_protocol/staking.ml +++ b/src/proto_alpha/lib_protocol/staking.ml @@ -122,6 +122,12 @@ let stake ctxt ~sender ~delegate amount = let* ctxt, finalize_balance_updates = finalize_unstake_and_check ~check_unfinalizable ctxt sender in + let* ctxt, _new_pseudotokens = + Staking_pseudotokens.credit_frozen_deposits_pseudotokens_for_tez_amount + ctxt + delegate + amount + in let* ctxt, stake_balance_updates = Token.transfer ctxt diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli index d0ecc5e8083c..e5438d8a6c1f 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli @@ -31,7 +31,10 @@ increases [delegate]'s stake pseudotokens by an amount [pa] corresponding to [tez_amount] multiplied by the current rate of the delegate's frozen deposits pseudotokens per tez. - The function also returns [pa]. *) + The function also returns [pa]. + + This function must be called on "stake" before transferring tez to + [delegate]'s frozen deposits. *) val credit_frozen_deposits_pseudotokens_for_tez_amount : Raw_context.t -> Signature.Public_key_hash.t -> -- GitLab From 9586b0f3af56c9fb7fcb948338e45c06e93b7f9b Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 18:19:38 +0200 Subject: [PATCH 08/10] Proto/Staking_pseudotokens: credit_costaking_pseudotokens --- .../lib_protocol/staking_pseudotoken_repr.mli | 2 ++ .../staking_pseudotokens_storage.ml | 26 +++++++++++++++++++ .../staking_pseudotokens_storage.mli | 8 ++++++ 3 files changed, 36 insertions(+) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli index 225a6dc402c6..fce0311008ae 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotoken_repr.mli @@ -29,6 +29,8 @@ type t val encoding : t Data_encoding.t +val zero : t + val of_int64_exn : int64 -> t val to_int64 : t -> int64 diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml index eb0c3db6e1ea..33356dd987fb 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml @@ -82,3 +82,29 @@ let credit_frozen_deposits_pseudotokens_for_tez_amount ctxt delegate tez_amount (new_pseudotokens_balance, pseudotokens_to_add) in update_frozen_deposits_pseudotokens ~f ctxt delegate + +let update_costaking_pseudotokens ~f ctxt contract = + let open Lwt_result_syntax in + let* costaking_pseudotokens_opt = + Storage.Contract.Costaking_pseudotokens.find ctxt contract + in + let costaking_pseudotokens = + Option.value + ~default:Staking_pseudotoken_repr.zero + costaking_pseudotokens_opt + in + let*? new_costaking_pseudotokens = f costaking_pseudotokens in + let*! ctxt = + Storage.Contract.Costaking_pseudotokens.add + ctxt + contract + new_costaking_pseudotokens + in + return ctxt + +let credit_costaking_pseudotokens ctxt contract pseudotokens_to_add = + let f current_pseudotokens_balance = + Staking_pseudotoken_repr.( + current_pseudotokens_balance +? pseudotokens_to_add) + in + update_costaking_pseudotokens ~f ctxt contract diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli index e5438d8a6c1f..dd60fadcec83 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.mli @@ -40,3 +40,11 @@ val credit_frozen_deposits_pseudotokens_for_tez_amount : Signature.Public_key_hash.t -> Tez_repr.t -> (Raw_context.t * Staking_pseudotoken_repr.t) tzresult Lwt.t + +(** [credit_costaking_pseudotokens ctxt contract p_amount] increases + [contract]'s costaking pseudotokens balance by [p_amount]. *) +val credit_costaking_pseudotokens : + Raw_context.t -> + Contract_repr.t -> + Staking_pseudotoken_repr.t -> + Raw_context.t tzresult Lwt.t -- GitLab From 193bbae2f73d3d33b2dba65cd0e192d707f681d6 Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 18:21:30 +0200 Subject: [PATCH 09/10] Proto/Staking: credit costaker pseudotokens on stake --- src/proto_alpha/lib_protocol/alpha_context.mli | 3 +++ src/proto_alpha/lib_protocol/staking.ml | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 6c4dffa1beea..35a7e205fe73 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -4899,6 +4899,9 @@ module Staking_pseudotokens : sig val credit_frozen_deposits_pseudotokens_for_tez_amount : context -> public_key_hash -> Tez.t -> (context * t) tzresult Lwt.t + + val credit_costaking_pseudotokens : + context -> Contract.t -> t -> context tzresult Lwt.t end (** This module re-exports definitions from {!Fees_storage}. *) diff --git a/src/proto_alpha/lib_protocol/staking.ml b/src/proto_alpha/lib_protocol/staking.ml index 45fbc2a03c7d..663c545b1290 100644 --- a/src/proto_alpha/lib_protocol/staking.ml +++ b/src/proto_alpha/lib_protocol/staking.ml @@ -122,17 +122,24 @@ let stake ctxt ~sender ~delegate amount = let* ctxt, finalize_balance_updates = finalize_unstake_and_check ~check_unfinalizable ctxt sender in - let* ctxt, _new_pseudotokens = + let* ctxt, new_pseudotokens = Staking_pseudotokens.credit_frozen_deposits_pseudotokens_for_tez_amount ctxt delegate amount in + let sender_contract = Contract.Implicit sender in let* ctxt, stake_balance_updates = Token.transfer ctxt - (`Contract (Contract.Implicit sender)) + (`Contract sender_contract) (`Frozen_deposits delegate) amount in + let* ctxt = + Staking_pseudotokens.credit_costaking_pseudotokens + ctxt + sender_contract + new_pseudotokens + in return (ctxt, stake_balance_updates @ finalize_balance_updates) -- GitLab From 04b4fe7f01b09abdfb73d209788ccfa1ee4244fa Mon Sep 17 00:00:00 2001 From: Mehdi Bouaziz Date: Wed, 7 Jun 2023 18:30:34 +0200 Subject: [PATCH 10/10] Proto/Staking_pseudotokens: lazy init --- .../staking_pseudotokens_storage.ml | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml index 33356dd987fb..17b45f13a38c 100644 --- a/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml +++ b/src/proto_alpha/lib_protocol/staking_pseudotokens_storage.ml @@ -23,6 +23,30 @@ (* *) (*****************************************************************************) +(** Avoids a stitching. + Initializes contract's pseudotokens so that 1 pseudotoken = 1 mutez. *) +let get_or_init_frozen_deposits_pseudotokens ctxt contract ~frozen_deposits_tez + = + let open Lwt_result_syntax in + let* frozen_deposits_pseudotokens_opt = + Storage.Contract.Frozen_deposits_pseudotokens.find ctxt contract + in + match frozen_deposits_pseudotokens_opt with + | None -> + let initial_pseudotokens = + Staking_pseudotoken_repr.of_int64_exn + (Tez_repr.to_mutez frozen_deposits_tez) + in + let+ ctxt = + Storage.Contract.Frozen_deposits_pseudotokens.init + ctxt + contract + initial_pseudotokens + in + (ctxt, initial_pseudotokens) + | Some frozen_deposits_pseudotokens -> + return (ctxt, frozen_deposits_pseudotokens) + let pseudotokens_of ~frozen_deposits_pseudotokens ~frozen_deposits_tez ~tez_amount = if Tez_repr.(frozen_deposits_tez = zero) then ( @@ -51,8 +75,8 @@ let update_frozen_deposits_pseudotokens ~f ctxt delegate = let* {current_amount = frozen_deposits_tez; initial_amount = _} = Frozen_deposits_storage.get ctxt contract in - let* frozen_deposits_pseudotokens = - Storage.Contract.Frozen_deposits_pseudotokens.get ctxt contract + let* ctxt, frozen_deposits_pseudotokens = + get_or_init_frozen_deposits_pseudotokens ctxt contract ~frozen_deposits_tez in let*? new_frozen_deposits_pseudotokens, x = f ~frozen_deposits_pseudotokens ~frozen_deposits_tez -- GitLab