1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071(*****************************************************************************)(* *)(* 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. *)(* *)(*****************************************************************************)letget_cpmm_address=Storage.Liquidity_baking.Cpmm_address.getletget_escape_ema=Storage.Liquidity_baking.Escape_ema.gettypeescape_ema=Int32.tleton_cpmm_existsctxtf=get_cpmm_addressctxt>>=?funcpmm_contract->Contract_storage.existsctxtcpmm_contract>>=?function|false->(* do nothing if the cpmm is not found *)return(ctxt,[])|true->fctxtcpmm_contractleton_below_sunsetctxtf=letsunset_level=Constants_storage.liquidity_baking_sunset_levelctxtinletlevel=Raw_level_repr.to_int32(Level_storage.currentctxt).levelinifCompare.Int32.(level>=sunset_level)thenreturn(ctxt,[])elseon_cpmm_existsctxtf(* 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 *)letupdate_escape_emactxt~escape_vote=get_escape_emactxt>>=?funold_ema->(* if ema is over threshold, we don't update it because liquidity baking is permanently off *)ifCompare.Int32.(old_ema<Constants_storage.liquidity_baking_escape_ema_thresholdctxt)thenletnew_ema=Int32.(add(div(mul1999lold_ema)2000l)(ifescape_votethen1000lelse0l))inStorage.Liquidity_baking.Escape_ema.updatectxtnew_ema>|=?functxt->(ctxt,new_ema,false)elsereturn(ctxt,old_ema,true)leton_subsidy_allowedctxt~escape_votef=update_escape_emactxt~escape_vote>>=?fun(ctxt,escape_ema,threshold_reached)->(* liquidity baking permanently shuts off if threshold is reached once *)ifthreshold_reachedthenreturn(ctxt,[],escape_ema)elseon_below_sunsetctxtf>|=?fun(ctxt,operation_results)->(ctxt,operation_results,escape_ema)