https://gitlab.com/tezos/tezos
Raw File
Tip revision: b0d5e96ce6ee5ccd0a2b260013c1770d895ea532 authored by Alain Mebsout on 04 January 2023, 13:28:17 UTC
Proto/Alpha: expose inbox internal structure with skip list
Tip revision: b0d5e96
liquidity_baking_repr.ml
(*****************************************************************************)
(*                                                                           *)
(* Open Source License                                                       *)
(* Copyright (c) 2021 Tocqueville Group, Inc. <contact@tezos.com>            *)
(*                                                                           *)
(* Permission is hereby granted, free of charge, to any person obtaining a   *)
(* copy of this software and associated documentation files (the "Software"),*)
(* to deal in the Software without restriction, including without limitation *)
(* the rights to use, copy, modify, merge, publish, distribute, sublicense,  *)
(* and/or sell copies of the Software, and to permit persons to whom the     *)
(* Software is furnished to do so, subject to the following conditions:      *)
(*                                                                           *)
(* The above copyright notice and this permission notice shall be included   *)
(* in all copies or substantial portions of the Software.                    *)
(*                                                                           *)
(* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR*)
(* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  *)
(* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL   *)
(* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER*)
(* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING   *)
(* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER       *)
(* DEALINGS IN THE SOFTWARE.                                                 *)
(*                                                                           *)
(*****************************************************************************)

let get_cpmm_address = Storage.Liquidity_baking.Cpmm_address.get

let get_escape_ema = Storage.Liquidity_baking.Escape_ema.get

type escape_ema = Int32.t

let on_cpmm_exists ctxt f =
  get_cpmm_address ctxt
  >>=? fun cpmm_contract ->
  Contract_storage.exists ctxt cpmm_contract
  >>=? function
  | false ->
      (* do nothing if the cpmm is not found *)
      return (ctxt, [])
  | true ->
      f ctxt cpmm_contract

let on_below_sunset ctxt f =
  let sunset_level = Constants_storage.liquidity_baking_sunset_level ctxt in
  let level = Raw_level_repr.to_int32 (Level_storage.current ctxt).level in
  if Compare.Int32.(level >= sunset_level) then return (ctxt, [])
  else on_cpmm_exists ctxt f

(* ema starts at zero
   ema[n+1] = (1999 * ema[n] // 2000) + (1000 if escape_vote[n] else 0)
   where escape_vote is protocol_data.contents.liquidity_baking_escape_vote *)
let update_escape_ema ctxt ~escape_vote =
  get_escape_ema ctxt
  >>=? fun old_ema ->
  (* if ema is over threshold, we don't update it because liquidity baking is permanently off *)
  if
    Compare.Int32.(
      old_ema < Constants_storage.liquidity_baking_escape_ema_threshold ctxt)
  then
    let new_ema =
      Int32.(
        add (div (mul 1999l old_ema) 2000l) (if escape_vote then 1000l else 0l))
    in
    Storage.Liquidity_baking.Escape_ema.update ctxt new_ema
    >|=? fun ctxt -> (ctxt, new_ema, false)
  else return (ctxt, old_ema, true)

let on_subsidy_allowed ctxt ~escape_vote f =
  update_escape_ema ctxt ~escape_vote
  >>=? fun (ctxt, escape_ema, threshold_reached) ->
  (* liquidity baking permanently shuts off if threshold is reached once *)
  if threshold_reached then return (ctxt, [], escape_ema)
  else
    on_below_sunset ctxt f
    >|=? fun (ctxt, operation_results) -> (ctxt, operation_results, escape_ema)
back to top