Alpha: deactivate inactive delegate
This commit is contained in:
parent
fc08f2f8ef
commit
04bbbf9fe2
@ -353,7 +353,20 @@ let credit c contract amount =
|
|||||||
| Some balance ->
|
| Some balance ->
|
||||||
Lwt.return Tez_repr.(amount +? balance) >>=? fun balance ->
|
Lwt.return Tez_repr.(amount +? balance) >>=? fun balance ->
|
||||||
Storage.Contract.Balance.set c contract balance >>=? fun c ->
|
Storage.Contract.Balance.set c contract balance >>=? fun c ->
|
||||||
Roll_storage.Contract.add_amount c contract amount
|
Roll_storage.Contract.add_amount c contract amount >>=? fun c ->
|
||||||
|
begin
|
||||||
|
match contract with
|
||||||
|
| Implicit delegate ->
|
||||||
|
Delegate_storage.registered c delegate >>= fun registered ->
|
||||||
|
if registered then
|
||||||
|
Roll_storage.Delegate.set_active c delegate >>=? fun c ->
|
||||||
|
return c
|
||||||
|
else
|
||||||
|
return c
|
||||||
|
| Originated _ ->
|
||||||
|
return c
|
||||||
|
end >>=? fun c ->
|
||||||
|
return c
|
||||||
|
|
||||||
let spend c contract amount =
|
let spend c contract amount =
|
||||||
is_spendable c contract >>=? fun spendable ->
|
is_spendable c contract >>=? fun spendable ->
|
||||||
|
@ -150,10 +150,12 @@ let set c contract delegate =
|
|||||||
link c contract delegate balance >>=? fun c ->
|
link c contract delegate balance >>=? fun c ->
|
||||||
begin
|
begin
|
||||||
if self_delegation then
|
if self_delegation then
|
||||||
Storage.Delegates.add c delegate
|
Storage.Delegates.add c delegate >>= fun c ->
|
||||||
|
Roll_storage.Delegate.set_active c ~init:true delegate >>=? fun c ->
|
||||||
|
return c
|
||||||
else
|
else
|
||||||
Lwt.return c
|
return c
|
||||||
end >>= fun c ->
|
end >>=? fun c ->
|
||||||
return c
|
return c
|
||||||
|
|
||||||
let remove ctxt contract =
|
let remove ctxt contract =
|
||||||
@ -178,6 +180,7 @@ let credit_frozen_bond ctxt contract cycle amount =
|
|||||||
|
|
||||||
let freeze_bond ctxt delegate amount =
|
let freeze_bond ctxt delegate amount =
|
||||||
let { Level_repr.cycle ; _ } = Level_storage.current ctxt in
|
let { Level_repr.cycle ; _ } = Level_storage.current ctxt in
|
||||||
|
Roll_storage.Delegate.set_active ctxt delegate >>=? fun ctxt ->
|
||||||
let contract = Contract_repr.implicit_contract delegate in
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
Storage.Contract.Balance.get ctxt contract >>=? fun balance ->
|
||||||
Lwt.return Tez_repr.(balance -? amount) >>=? fun new_balance ->
|
Lwt.return Tez_repr.(balance -? amount) >>=? fun new_balance ->
|
||||||
@ -285,8 +288,13 @@ let cycle_end ctxt last_cycle unrevealed =
|
|||||||
~init:(Ok ctxt)
|
~init:(Ok ctxt)
|
||||||
~f:(fun delegate ctxt ->
|
~f:(fun delegate ctxt ->
|
||||||
Lwt.return ctxt >>=? fun ctxt ->
|
Lwt.return ctxt >>=? fun ctxt ->
|
||||||
unfreeze ctxt delegate unfrozen_cycle)
|
unfreeze ctxt delegate unfrozen_cycle >>=? fun ctxt ->
|
||||||
|
Storage.Contract.Delegate_desactivation.get ctxt
|
||||||
|
(Contract_repr.implicit_contract delegate) >>=? fun cycle ->
|
||||||
|
if Cycle_repr.(cycle <= last_cycle) then
|
||||||
|
Roll_storage.Delegate.set_inactive ctxt delegate
|
||||||
|
else
|
||||||
|
return ctxt)
|
||||||
|
|
||||||
let punish ctxt delegate cycle =
|
let punish ctxt delegate cycle =
|
||||||
let contract = Contract_repr.implicit_contract delegate in
|
let contract = Contract_repr.implicit_contract delegate in
|
||||||
|
@ -25,6 +25,8 @@ val get:
|
|||||||
Raw_context.t -> Contract_repr.t ->
|
Raw_context.t -> Contract_repr.t ->
|
||||||
Ed25519.Public_key_hash.t option tzresult Lwt.t
|
Ed25519.Public_key_hash.t option tzresult Lwt.t
|
||||||
|
|
||||||
|
val registered: Raw_context.t -> Ed25519.Public_key_hash.t -> bool Lwt.t
|
||||||
|
|
||||||
(** Updating the delegate of a contract.
|
(** Updating the delegate of a contract.
|
||||||
|
|
||||||
When calling this function on an "implicit contract" this function
|
When calling this function on an "implicit contract" this function
|
||||||
|
@ -272,9 +272,21 @@ module Delegate = struct
|
|||||||
Storage.Roll.Delegate_change.set ctxt delegate change >>=? fun ctxt ->
|
Storage.Roll.Delegate_change.set ctxt delegate change >>=? fun ctxt ->
|
||||||
return ctxt
|
return ctxt
|
||||||
|
|
||||||
let set_active ctxt delegate =
|
let set_active ctxt ?(init = false) delegate =
|
||||||
Storage.Contract.Inactive_delegate.mem ctxt
|
Storage.Contract.Inactive_delegate.mem ctxt
|
||||||
(Contract_repr.implicit_contract delegate) >>= fun inactive ->
|
(Contract_repr.implicit_contract delegate) >>= fun inactive ->
|
||||||
|
let current_cycle = (Raw_context.current_level ctxt).cycle in
|
||||||
|
let preserved_cycles = Constants_storage.preserved_cycles ctxt in
|
||||||
|
(* When the delegate is new or inactive, she will become active in
|
||||||
|
`1+preserved_cycles`, and we allows `preserved_cycles` for the
|
||||||
|
delegate to start baking. When the delegate is active, we only
|
||||||
|
give me at least `preserved_cycles` after the current cycle
|
||||||
|
before to be deactivated. *)
|
||||||
|
let delay =
|
||||||
|
if init || inactive then (1+2*preserved_cycles) else 1+preserved_cycles in
|
||||||
|
Storage.Contract.Delegate_desactivation.init_set ctxt
|
||||||
|
(Contract_repr.implicit_contract delegate)
|
||||||
|
Cycle_repr.(add current_cycle delay) >>= fun ctxt ->
|
||||||
if not inactive then
|
if not inactive then
|
||||||
return ctxt
|
return ctxt
|
||||||
else begin
|
else begin
|
||||||
|
@ -52,7 +52,7 @@ module Delegate : sig
|
|||||||
|
|
||||||
val set_inactive : Raw_context.t -> Ed25519.Public_key_hash.t -> Raw_context.t tzresult Lwt.t
|
val set_inactive : Raw_context.t -> Ed25519.Public_key_hash.t -> Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
val set_active : Raw_context.t -> Ed25519.Public_key_hash.t -> Raw_context.t tzresult Lwt.t
|
val set_active : Raw_context.t -> ?init:bool -> Ed25519.Public_key_hash.t -> Raw_context.t tzresult Lwt.t
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -109,6 +109,11 @@ module Contract = struct
|
|||||||
Indexed_context.Make_set
|
Indexed_context.Make_set
|
||||||
(struct let name = ["inactive_delegate"] end)
|
(struct let name = ["inactive_delegate"] end)
|
||||||
|
|
||||||
|
module Delegate_desactivation =
|
||||||
|
Indexed_context.Make_map
|
||||||
|
(struct let name = ["delegate_desactivation"] end)
|
||||||
|
(Make_value(Cycle_repr))
|
||||||
|
|
||||||
module Delegated =
|
module Delegated =
|
||||||
Make_data_set_storage
|
Make_data_set_storage
|
||||||
(Make_subcontext
|
(Make_subcontext
|
||||||
|
@ -137,6 +137,12 @@ module Contract : sig
|
|||||||
with type elt = Contract_repr.t
|
with type elt = Contract_repr.t
|
||||||
and type t = Raw_context.t
|
and type t = Raw_context.t
|
||||||
|
|
||||||
|
(** The cycle where the delegate should be desactivated. *)
|
||||||
|
module Delegate_desactivation : Indexed_data_storage
|
||||||
|
with type key = Contract_repr.t
|
||||||
|
and type value = Cycle_repr.t
|
||||||
|
and type t := Raw_context.t
|
||||||
|
|
||||||
module Spendable : Data_set_storage
|
module Spendable : Data_set_storage
|
||||||
with type elt = Contract_repr.t
|
with type elt = Contract_repr.t
|
||||||
and type t := Raw_context.t
|
and type t := Raw_context.t
|
||||||
|
Loading…
Reference in New Issue
Block a user