From 6ec3c652db1ae277f862bca48f4685e1206f18e0 Mon Sep 17 00:00:00 2001 From: Julien Tesson Date: Wed, 28 Jun 2023 18:00:35 +0200 Subject: [PATCH 1/3] proto/unstake_request: add encoding for prepared_finalize_unstake --- .../lib_protocol/alpha_context.mli | 3 ++ .../lib_protocol/unstake_requests_storage.ml | 32 +++++++++++++++++++ .../lib_protocol/unstake_requests_storage.mli | 3 ++ 3 files changed, 38 insertions(+) diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 3ee73cfd2d69..538d9cbfeb56 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -4908,6 +4908,9 @@ module Unstake_requests : sig unfinalizable : stored_requests; } + val prepared_finalize_unstake_encoding : + prepared_finalize_unstake Data_encoding.encoding + val prepare_finalize_unstake : context -> Contract.t -> prepared_finalize_unstake option tzresult Lwt.t diff --git a/src/proto_alpha/lib_protocol/unstake_requests_storage.ml b/src/proto_alpha/lib_protocol/unstake_requests_storage.ml index 1ec8f4143bd4..7f2a1e41e2e6 100644 --- a/src/proto_alpha/lib_protocol/unstake_requests_storage.ml +++ b/src/proto_alpha/lib_protocol/unstake_requests_storage.ml @@ -26,16 +26,48 @@ type finalizable = (Signature.Public_key_hash.t * Cycle_repr.t * Tez_repr.t) list +let finalizable_encoding = + let open Data_encoding in + let elt_encoding = + obj3 + (req "delegate" Signature.Public_key_hash.encoding) + (req "cycle" Cycle_repr.encoding) + (req "amount" Tez_repr.encoding) + in + list elt_encoding + type stored_requests = Storage.Unstake_request.t = { delegate : Signature.Public_key_hash.t; requests : (Cycle_repr.t * Tez_repr.t) list; } +let stored_requests_encoding = + let open Data_encoding in + let request_encoding = + obj2 (req "cycle" Cycle_repr.encoding) (req "amount" Tez_repr.encoding) + in + conv + (fun {delegate; requests} -> (delegate, requests)) + (fun (delegate, requests) -> {delegate; requests}) + (obj2 + (req "delegate" Signature.Public_key_hash.encoding) + (req "requests" (list request_encoding))) + type prepared_finalize_unstake = { finalizable : finalizable; unfinalizable : stored_requests; } +let prepared_finalize_unstake_encoding : + prepared_finalize_unstake Data_encoding.t = + let open Data_encoding in + conv + (fun {finalizable; unfinalizable} -> (finalizable, unfinalizable)) + (fun (finalizable, unfinalizable) -> {finalizable; unfinalizable}) + (obj2 + (req "finalizable" finalizable_encoding) + (req "unfinalizable" stored_requests_encoding)) + let z100 = Z.of_int 100 let apply_slashes ~preserved_plus_slashing slashing_history ~from_cycle amount = diff --git a/src/proto_alpha/lib_protocol/unstake_requests_storage.mli b/src/proto_alpha/lib_protocol/unstake_requests_storage.mli index 9c859ad10f49..5d75ee4a97f4 100644 --- a/src/proto_alpha/lib_protocol/unstake_requests_storage.mli +++ b/src/proto_alpha/lib_protocol/unstake_requests_storage.mli @@ -41,6 +41,9 @@ type prepared_finalize_unstake = { unfinalizable : stored_requests; } +val prepared_finalize_unstake_encoding : + prepared_finalize_unstake Data_encoding.encoding + (** [prepare_finalize_unstake ctxt contract] preprocesses a [finalize_unstake] for [contract]. It returns a list of transfers [(d, c, a)] to do from delegate's [d] unstaked frozen deposits for cycle [c] of amount [a] in -- GitLab From a4f455877d664a4fc66e61463b5d76856df31a33 Mon Sep 17 00:00:00 2001 From: Lucas Randazzo Date: Wed, 5 Jul 2023 19:36:04 +0200 Subject: [PATCH 2/3] Proto/ai: add variation to RPC specific function --- src/proto_alpha/lib_protocol/alpha_context.ml | 10 ++++++++++ src/proto_alpha/lib_protocol/alpha_context.mli | 3 +++ 2 files changed, 13 insertions(+) diff --git a/src/proto_alpha/lib_protocol/alpha_context.ml b/src/proto_alpha/lib_protocol/alpha_context.ml index 14ca813b7c46..9b52ee10f0f2 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.ml +++ b/src/proto_alpha/lib_protocol/alpha_context.ml @@ -645,6 +645,16 @@ module Unstake_requests = struct Unstake_requests_storage.For_RPC.apply_slash_to_unstaked_unfinalizable ctxt {delegate; requests} + + let apply_slash_to_unstaked_unfinalizable_stored_requests ctxt + {delegate; requests} = + let open Lwt_result_syntax in + let* requests = + Unstake_requests_storage.For_RPC.apply_slash_to_unstaked_unfinalizable + ctxt + {delegate; requests} + in + return {delegate; requests} end end diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 538d9cbfeb56..d5771589aa47 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -4931,6 +4931,9 @@ module Unstake_requests : sig delegate:public_key_hash -> requests:(Cycle.t * Tez.t) list -> (Cycle.t * Tez.t) list tzresult Lwt.t + + val apply_slash_to_unstaked_unfinalizable_stored_requests : + context -> stored_requests -> stored_requests tzresult Lwt.t end end -- GitLab From b2f7ee305e8775db22af92f4a7643528558025ae Mon Sep 17 00:00:00 2001 From: Lucas Randazzo Date: Wed, 5 Jul 2023 19:36:35 +0200 Subject: [PATCH 3/3] Proto/ai/rpc: add unstake requests RPC --- .../lib_protocol/contract_services.ml | 25 +++++++++++++++++++ .../lib_protocol/contract_services.mli | 6 +++++ 2 files changed, 31 insertions(+) diff --git a/src/proto_alpha/lib_protocol/contract_services.ml b/src/proto_alpha/lib_protocol/contract_services.ml index 678dcc192f75..4de6133cfe79 100644 --- a/src/proto_alpha/lib_protocol/contract_services.ml +++ b/src/proto_alpha/lib_protocol/contract_services.ml @@ -116,6 +116,18 @@ module S = struct RPC_path.( custom_root /: Contract.rpc_arg / "unstaked_finalizable_balance") + let unstake_requests = + RPC_service.get_service + ~description: + "Access the unstake requests of the contract. The requests that appear \ + in the finalizable field can be finalized, which means that the \ + contract can transfer these (no longer frozen) funds to their \ + spendable balance with a [finalize_unstake] operation call. Returns \ + None if there is no unstake request pending." + ~query:RPC_query.empty + ~output:(option Unstake_requests.prepared_finalize_unstake_encoding) + RPC_path.(custom_root /: Contract.rpc_arg / "unstake_requests") + let full_balance = RPC_service.get_service ~description: @@ -446,6 +458,16 @@ let register () = S.unstaked_finalizable_balance Contract.For_RPC.get_unstaked_finalizable_balance ; register_field ~chunked:false S.full_balance Contract.For_RPC.get_full_balance ; + register1 ~chunked:false S.unstake_requests (fun ctxt contract () () -> + Unstake_requests.prepare_finalize_unstake ctxt contract >>=? function + | None -> return_none + | Some {finalizable; unfinalizable} -> + Unstake_requests.For_RPC + .apply_slash_to_unstaked_unfinalizable_stored_requests + ctxt + unfinalizable + >>=? fun unfinalizable -> + return_some Unstake_requests.{finalizable; unfinalizable}) ; opt_register1 ~chunked:false S.manager_key (fun ctxt contract () () -> match contract with | Originated _ -> return_none @@ -659,6 +681,9 @@ let unstaked_finalizable_balance ctxt block contract = () () +let unstake_requests ctxt block contract = + RPC_context.make_call1 S.unstake_requests ctxt block contract () () + let full_balance ctxt block contract = RPC_context.make_call1 S.full_balance ctxt block contract () () diff --git a/src/proto_alpha/lib_protocol/contract_services.mli b/src/proto_alpha/lib_protocol/contract_services.mli index aa1c199a3472..02be39258942 100644 --- a/src/proto_alpha/lib_protocol/contract_services.mli +++ b/src/proto_alpha/lib_protocol/contract_services.mli @@ -75,6 +75,12 @@ val unstaked_finalizable_balance : Contract.t -> Tez.t option shell_tzresult Lwt.t +val unstake_requests : + 'a #RPC_context.simple -> + 'a -> + Contract.t -> + Unstake_requests.prepared_finalize_unstake option shell_tzresult Lwt.t + val full_balance : 'a #RPC_context.simple -> 'a -> Contract.t -> Tez.t shell_tzresult Lwt.t -- GitLab