Source file liquidity_baking_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
open Liquidity_baking_repr
let get_cpmm_address = Storage.Liquidity_baking.Cpmm_address.get
let get_toggle_ema ctxt =
Storage.Liquidity_baking.Toggle_ema.get ctxt >>=? fun ema ->
Toggle_EMA.of_int32 ema
let on_cpmm_exists ctxt f =
get_cpmm_address ctxt >>=? fun cpmm_contract ->
Contract_storage.exists ctxt (Contract_repr.Originated cpmm_contract)
>>= function
| false ->
return (ctxt, [])
| true -> f ctxt cpmm_contract
let check_below_sunset ctxt =
let sunset_level = Constants_storage.liquidity_baking_sunset_level ctxt in
let level = Raw_level_repr.to_int32 (Level_storage.current ctxt).level in
Compare.Int32.(level < sunset_level)
let update_toggle_ema ctxt ~toggle_vote =
get_toggle_ema ctxt >>=? fun old_ema ->
let new_ema = compute_new_ema ~toggle_vote old_ema in
Storage.Liquidity_baking.Toggle_ema.update ctxt (Toggle_EMA.to_int32 new_ema)
>|=? fun ctxt -> (ctxt, new_ema)
let check_ema_below_threshold ctxt ema =
Toggle_EMA.(
ema < Constants_storage.liquidity_baking_toggle_ema_threshold ctxt)
let on_subsidy_allowed ctxt ~toggle_vote f =
update_toggle_ema ctxt ~toggle_vote >>=? fun (ctxt, toggle_ema) ->
if check_ema_below_threshold ctxt toggle_ema && check_below_sunset ctxt then
on_cpmm_exists ctxt f >|=? fun (ctxt, operation_results) ->
(ctxt, operation_results, toggle_ema)
else return (ctxt, [], toggle_ema)