diff --git a/docs/protocols/alpha.rst b/docs/protocols/alpha.rst index f968ab404c9c9130020f175bc20d85063b65ad27..144e9d9cdf4afc582c2e878d73493faa95f2b86e 100644 --- a/docs/protocols/alpha.rst +++ b/docs/protocols/alpha.rst @@ -35,6 +35,13 @@ Adaptive Inflation (ongoing) - Introduce feature flag for Adaptive Inflation. (MR :gl:`!8566`) +When the feature flag is enabled, the following extra changes happen: + +- Most rewards (baking rewards, baking bonuses, attestation rewards, revelation + rewards) are paid on the frozen deposits balance rather than the spendable + balance. Manager operations fees and denunciation rewards are still paid on + the spendable balance. (MR :gl:`!8091`) + Gas improvements ---------------- diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 90455f6a73852feb10f7de8d81e87c668f259c7f..cf9b32c04279b17dfbde6a754fee804e33b12cd7 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -1030,6 +1030,8 @@ module Constants : sig val zk_rollup_min_pending_to_process : context -> int + val freeze_rewards : context -> bool + (** All constants: fixed and parametric *) type t = private {fixed : fixed; parametric : Parametric.t} diff --git a/src/proto_alpha/lib_protocol/apply.ml b/src/proto_alpha/lib_protocol/apply.ml index da58a2c27e4dd00662b1613eadb39ad7eecd6bad..36a7341e4a5f4a80961bd393263b06fafb7217af 100644 --- a/src/proto_alpha/lib_protocol/apply.ml +++ b/src/proto_alpha/lib_protocol/apply.ml @@ -1973,19 +1973,23 @@ let apply_contents_list (type kind) ctxt chain_id (mode : mode) let level = Level.from_raw ctxt level in Nonce.reveal ctxt level nonce >>=? fun ctxt -> let tip = Delegate.Rewards.seed_nonce_revelation_tip ctxt in - let contract = - Contract.Implicit payload_producer.Consensus_key.delegate + let delegate = payload_producer.Consensus_key.delegate in + let receiver = + if Constants.freeze_rewards ctxt then `Frozen_deposits delegate + else `Contract (Contract.Implicit delegate) in - Token.transfer ctxt `Revelation_rewards (`Contract contract) tip + Token.transfer ctxt `Revelation_rewards receiver tip >|=? fun (ctxt, balance_updates) -> (ctxt, Single_result (Seed_nonce_revelation_result balance_updates)) | Single (Vdf_revelation {solution}) -> Seed.update_seed ctxt solution >>=? fun ctxt -> let tip = Delegate.Rewards.vdf_revelation_tip ctxt in - let contract = - Contract.Implicit payload_producer.Consensus_key.delegate + let delegate = payload_producer.Consensus_key.delegate in + let receiver = + if Constants.freeze_rewards ctxt then `Frozen_deposits delegate + else `Contract (Contract.Implicit delegate) in - Token.transfer ctxt `Revelation_rewards (`Contract contract) tip + Token.transfer ctxt `Revelation_rewards receiver tip >|=? fun (ctxt, balance_updates) -> (ctxt, Single_result (Vdf_revelation_result balance_updates)) | Single (Double_preendorsement_evidence {op1; op2 = _}) -> diff --git a/src/proto_alpha/lib_protocol/constants_storage.ml b/src/proto_alpha/lib_protocol/constants_storage.ml index abcf569dd7fc51c227a921fc3d648faeb691fcfc..194ce3ce9a37a703941199bf2b9d3b6735b72610 100644 --- a/src/proto_alpha/lib_protocol/constants_storage.ml +++ b/src/proto_alpha/lib_protocol/constants_storage.ml @@ -277,3 +277,9 @@ let zk_rollup_min_pending_to_process c = let zk_rollup_origination_size c = let zk_rollup = Raw_context.zk_rollup c in zk_rollup.origination_size + +let adaptive_inflation c = (Raw_context.constants c).adaptive_inflation + +let adaptive_inflation_enable c = (adaptive_inflation c).enable + +let freeze_rewards = adaptive_inflation_enable diff --git a/src/proto_alpha/lib_protocol/constants_storage.mli b/src/proto_alpha/lib_protocol/constants_storage.mli index 688f68a517a58a7cfd239ee13f191e254ce6a86f..ea2fce0e8e7b9e2c6bdf7da4796a4bf213115a7b 100644 --- a/src/proto_alpha/lib_protocol/constants_storage.mli +++ b/src/proto_alpha/lib_protocol/constants_storage.mli @@ -161,3 +161,7 @@ val zk_rollup_enable : Raw_context.t -> bool val zk_rollup_min_pending_to_process : Raw_context.t -> int val zk_rollup_origination_size : Raw_context.t -> int + +val adaptive_inflation_enable : Raw_context.t -> bool + +val freeze_rewards : Raw_context.t -> bool diff --git a/src/proto_alpha/lib_protocol/delegate_cycles.ml b/src/proto_alpha/lib_protocol/delegate_cycles.ml index f2435b21f52efc5ee11338ffbd6da5f20ced11d3..1b335394682a574d9fdf97742efc507dc4561d78 100644 --- a/src/proto_alpha/lib_protocol/delegate_cycles.ml +++ b/src/proto_alpha/lib_protocol/delegate_cycles.ml @@ -228,7 +228,6 @@ let distribute_endorsing_rewards ctxt last_cycle unrevealed_nonces = Stake_storage.get_selected_distribution ctxt last_cycle >>=? fun delegates -> List.fold_left_es (fun (ctxt, balance_updates) (delegate, active_stake) -> - let delegate_contract = Contract_repr.Implicit delegate in Delegate_missed_endorsements_storage .check_and_reset_delegate_participation ctxt @@ -248,11 +247,12 @@ let distribute_endorsing_rewards ctxt last_cycle unrevealed_nonces = let rewards = Tez_repr.mul_exn endorsing_reward_per_slot expected_slots in if sufficient_participation && has_revealed_nonces then (* Sufficient participation: we pay the rewards *) - Token.transfer - ctxt - `Endorsing_rewards - (`Contract delegate_contract) - rewards + let receiver = + if Constants_storage.freeze_rewards ctxt then + `Frozen_deposits delegate + else `Contract (Contract_repr.Implicit delegate) + in + Token.transfer ctxt `Endorsing_rewards receiver rewards >|=? fun (ctxt, payed_rewards_receipts) -> (ctxt, payed_rewards_receipts @ balance_updates) else diff --git a/src/proto_alpha/lib_protocol/delegate_missed_endorsements_storage.ml b/src/proto_alpha/lib_protocol/delegate_missed_endorsements_storage.ml index 485cd3eed19392978be04805862eeb04e59cf414..6ebef3a3cd705ee947f9fe63a086cf2b2ccf1ed5 100644 --- a/src/proto_alpha/lib_protocol/delegate_missed_endorsements_storage.ml +++ b/src/proto_alpha/lib_protocol/delegate_missed_endorsements_storage.ml @@ -108,17 +108,25 @@ let record_baking_activity_and_pay_rewards_and_fees ctxt ~payload_producer Stake_storage.set_active ctxt block_producer else return ctxt) >>=? fun ctxt -> + let freeze_rewards = Constants_storage.freeze_rewards ctxt in let pay_payload_producer ctxt delegate = let contract = Contract_repr.Implicit delegate in Token.balance ctxt `Block_fees >>=? fun (ctxt, block_fees) -> - Token.transfer_n - ctxt - [(`Block_fees, block_fees); (`Baking_rewards, baking_reward)] - (`Contract contract) + Token.transfer ctxt `Block_fees (`Contract contract) block_fees + >>=? fun (ctxt, balance_updates_block_fees) -> + let receiver = + if freeze_rewards then `Frozen_deposits delegate else `Contract contract + in + Token.transfer ctxt `Baking_rewards receiver baking_reward + >|=? fun (ctxt, balance_updates_baking_rewards) -> + (ctxt, balance_updates_block_fees @ balance_updates_baking_rewards) in let pay_block_producer ctxt delegate bonus = - let contract = Contract_repr.Implicit delegate in - Token.transfer ctxt `Baking_bonuses (`Contract contract) bonus + let receiver = + if freeze_rewards then `Frozen_deposits delegate + else `Contract (Contract_repr.Implicit delegate) + in + Token.transfer ctxt `Baking_bonuses receiver bonus in pay_payload_producer ctxt payload_producer >>=? fun (ctxt, balance_updates_payload_producer) ->