Source file delegate_activation_storage.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
let is_inactive ctxt delegate =
let open Lwt_result_syntax in
let*! inactive =
Storage.Contract.Inactive_delegate.mem
ctxt
(Contract_repr.Implicit delegate)
in
if inactive then Lwt.return_ok inactive
else
let+ cycle_opt =
Storage.Contract.Delegate_last_cycle_before_deactivation.find
ctxt
(Contract_repr.Implicit delegate)
in
match cycle_opt with
| Some last_active_cycle ->
let ({Level_repr.cycle = current_cycle; _} : Level_repr.t) =
Raw_context.current_level ctxt
in
Cycle_repr.(last_active_cycle < current_cycle)
| None ->
false
let last_cycle_before_deactivation ctxt delegate =
let contract = Contract_repr.Implicit delegate in
Storage.Contract.Delegate_last_cycle_before_deactivation.get ctxt contract
let set_inactive ctxt delegate =
Storage.Contract.Inactive_delegate.add ctxt (Contract_repr.Implicit delegate)
let set_active ctxt delegate =
let open Lwt_result_syntax in
let* inactive = is_inactive ctxt delegate in
let current_cycle = (Raw_context.current_level ctxt).cycle in
let preserved_cycles = Constants_storage.preserved_cycles ctxt in
let delegate_contract = Contract_repr.Implicit delegate in
let* current_last_active_cycle =
Storage.Contract.Delegate_last_cycle_before_deactivation.find
ctxt
delegate_contract
in
let last_active_cycle =
match current_last_active_cycle with
| None -> Cycle_repr.add current_cycle (1 + (2 * preserved_cycles))
| Some current_last_active_cycle ->
let delay =
if inactive then 1 + (2 * preserved_cycles) else 1 + preserved_cycles
in
let updated = Cycle_repr.add current_cycle delay in
Cycle_repr.max current_last_active_cycle updated
in
let*! ctxt =
Storage.Contract.Delegate_last_cycle_before_deactivation.add
ctxt
delegate_contract
last_active_cycle
in
if not inactive then return (ctxt, inactive)
else
let*! ctxt =
Storage.Contract.Inactive_delegate.remove ctxt delegate_contract
in
return (ctxt, inactive)