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
let is_inactive ctxt delegate =
Storage.Contract.Inactive_delegate.mem ctxt (Contract_repr.Implicit delegate)
>>= fun inactive ->
if inactive then return inactive
else
Storage.Contract.Delegate_last_cycle_before_deactivation.find
ctxt
(Contract_repr.Implicit delegate)
>|=? function
| 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 =
is_inactive ctxt delegate >>=? fun inactive ->
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
Storage.Contract.Delegate_last_cycle_before_deactivation.find
ctxt
delegate_contract
>>=? fun current_last_active_cycle ->
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
Storage.Contract.Delegate_last_cycle_before_deactivation.add
ctxt
delegate_contract
last_active_cycle
>>= fun ctxt ->
if not inactive then return (ctxt, inactive)
else
Storage.Contract.Inactive_delegate.remove ctxt delegate_contract
>>= fun ctxt -> return (ctxt, inactive)