diff --git a/contrib/kaitai-struct-files/files/alpha__frozen_staker.ksy b/contrib/kaitai-struct-files/files/alpha__frozen_staker.ksy index 0143c5b8bcfed1a0ce236c6d74efb5d394092335..b81d1c9efabda00c524fbb4d5ff1db713b037ae7 100644 --- a/contrib/kaitai-struct-files/files/alpha__frozen_staker.ksy +++ b/contrib/kaitai-struct-files/files/alpha__frozen_staker.ksy @@ -31,6 +31,10 @@ types: type: public_key_hash if: (alpha__frozen_staker_tag == alpha__frozen_staker_tag::baker) doc: A Ed25519, Secp256k1, P256, or BLS public key hash + - id: baker_edge + type: public_key_hash + if: (alpha__frozen_staker_tag == alpha__frozen_staker_tag::baker_edge) + doc: A Ed25519, Secp256k1, P256, or BLS public key hash originated: seq: - id: contract_hash @@ -73,6 +77,7 @@ enums: 0: single 1: shared 2: baker + 3: baker_edge public_key_hash_tag: 0: ed25519 1: secp256k1 diff --git a/contrib/kaitai-struct-files/files/alpha__receipt__balance_updates.ksy b/contrib/kaitai-struct-files/files/alpha__receipt__balance_updates.ksy index a94e489404ea59f17269eaecd7873b4088ba053e..4d7f8f1b7562b84427ce168491a484553a6baaf8 100644 --- a/contrib/kaitai-struct-files/files/alpha__receipt__balance_updates.ksy +++ b/contrib/kaitai-struct-files/files/alpha__receipt__balance_updates.ksy @@ -39,6 +39,10 @@ types: type: public_key_hash if: (alpha__frozen_staker_tag == alpha__frozen_staker_tag::baker) doc: A Ed25519, Secp256k1, P256, or BLS public key hash + - id: baker_edge + type: public_key_hash + if: (alpha__frozen_staker_tag == alpha__frozen_staker_tag::baker_edge) + doc: A Ed25519, Secp256k1, P256, or BLS public key hash alpha__operation_metadata__alpha__balance_and_update: seq: - id: alpha__operation_metadata__alpha__balance_and_update_tag @@ -281,6 +285,7 @@ enums: 0: single 1: shared 2: baker + 3: baker_edge alpha__operation_metadata__alpha__balance_and_update_tag: 0: contract 2: block_fees diff --git a/docs/protocols/alpha.rst b/docs/protocols/alpha.rst index 665c2730ff9c97f802293faa09b95e25c709218b..dcb9439465259032afec933218acd7f91ee65d28 100644 --- a/docs/protocols/alpha.rst +++ b/docs/protocols/alpha.rst @@ -151,6 +151,12 @@ RPC Changes Operation receipts ------------------ +- To better differentiate Deposits coming from 'rewards from bakers own stakes' + from 'the edge bakers may take from their stakers rewards', the balance updates + field has been specialized. The field {"staker":{"baker": }} is now + split into {"staker":{"baker_own_stake": }} and {"staker":{"baker_edge": + }}. (MR :gl:`!12258`) + Protocol parameters ------------------- diff --git a/src/proto_alpha/lib_client/operation_result.ml b/src/proto_alpha/lib_client/operation_result.ml index c93787aedcca2240db66cccdf1180841aec90d9a..811bdc1fc4f4766a0beab8535c53f71d5d397c9e 100644 --- a/src/proto_alpha/lib_client/operation_result.ml +++ b/src/proto_alpha/lib_client/operation_result.ml @@ -382,6 +382,8 @@ let pp_balance_updates ppf balance_updates = let pp_frozen_staker ppf (staker : Receipt.frozen_staker) = match staker with | Baker baker -> pp_baker ppf baker + | Baker_edge baker -> + Format.fprintf ppf "baker edge %a" Signature.Public_key_hash.pp baker | Single_staker {staker; delegate} -> Format.fprintf ppf diff --git a/src/proto_alpha/lib_protocol/alpha_context.ml b/src/proto_alpha/lib_protocol/alpha_context.ml index f60dd9f9987f65093a8d2f5628ce3272cb35b64d..6e5b48cc2a7e0f5c9ea01458f0ab470007cd5b0c 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.ml +++ b/src/proto_alpha/lib_protocol/alpha_context.ml @@ -525,9 +525,12 @@ module Receipt = struct delegate : Signature.public_key_hash; } | Shared_between_stakers of {delegate : Signature.public_key_hash} + | Baker_edge of Signature.public_key_hash let frozen_baker = Frozen_staker_repr.baker + let frozen_baker_edge = Frozen_staker_repr.baker_edge + let frozen_single_staker = Frozen_staker_repr.single_staker let frozen_shared_between_stakers = Frozen_staker_repr.shared_between_stakers diff --git a/src/proto_alpha/lib_protocol/alpha_context.mli b/src/proto_alpha/lib_protocol/alpha_context.mli index 8190c6c0a56bdebc4de5c23672448e7109c8bcb4..3b1211e81d3811bc57918315b4eb0c66be862fa6 100644 --- a/src/proto_alpha/lib_protocol/alpha_context.mli +++ b/src/proto_alpha/lib_protocol/alpha_context.mli @@ -2118,9 +2118,12 @@ module Receipt : sig delegate : Signature.public_key_hash; } | Shared_between_stakers of {delegate : Signature.public_key_hash} + | Baker_edge of Signature.public_key_hash val frozen_baker : Signature.public_key_hash -> frozen_staker + val frozen_baker_edge : Signature.public_key_hash -> frozen_staker + val frozen_single_staker : staker:Contract.t -> delegate:Signature.public_key_hash -> frozen_staker diff --git a/src/proto_alpha/lib_protocol/frozen_staker_repr.ml b/src/proto_alpha/lib_protocol/frozen_staker_repr.ml index a181714a85ed30ea1a381f8dc595f33e24d08356..d1c47db3e579e13c98376cab5385a4fde50813c4 100644 --- a/src/proto_alpha/lib_protocol/frozen_staker_repr.ml +++ b/src/proto_alpha/lib_protocol/frozen_staker_repr.ml @@ -12,9 +12,12 @@ type t = delegate : Signature.public_key_hash; } | Shared_between_stakers of {delegate : Signature.public_key_hash} + | Baker_edge of Signature.public_key_hash let baker pkh = Baker pkh +let baker_edge pkh = Baker_edge pkh + let single_staker ~staker ~delegate = match (staker : Contract_repr.t) with | Implicit pkh when Signature.Public_key_hash.(pkh = delegate) -> Baker pkh @@ -35,7 +38,13 @@ let encoding = obj1 (req "delegate" Signature.Public_key_hash.encoding) in let baker_tag = 2 in - let baker_encoding = obj1 (req "baker" Signature.Public_key_hash.encoding) in + let baker_encoding = + obj1 (req "baker_own_stake" Signature.Public_key_hash.encoding) + in + let baker_edge_tag = 3 in + let baker_edge_encoding = + obj1 (req "baker_edge" Signature.Public_key_hash.encoding) + in def ~title:"frozen_staker" ~description: @@ -49,7 +58,8 @@ let encoding = | Single_staker {staker; delegate} -> matched single_tag single_encoding (staker, delegate) | Shared_between_stakers {delegate} -> - matched shared_tag shared_encoding delegate) + matched shared_tag shared_encoding delegate + | Baker_edge baker -> matched baker_edge_tag baker_edge_encoding baker) [ case ~title:"Single" @@ -72,6 +82,12 @@ let encoding = baker_encoding (function Baker baker -> Some baker | _ -> None) (fun baker -> Baker baker); + case + ~title:"Baker_edge" + (Tag baker_edge_tag) + baker_edge_encoding + (function Baker_edge baker -> Some baker | _ -> None) + (fun baker -> Baker_edge baker); ] let compare sa sb = @@ -88,3 +104,6 @@ let compare sa sb = Signature.Public_key_hash.compare da db | Single_staker _, Shared_between_stakers _ -> -1 | Shared_between_stakers _, Single_staker _ -> 1 + | Baker_edge ba, Baker_edge bb -> Signature.Public_key_hash.compare ba bb + | Baker_edge _, _ -> -1 + | _, Baker_edge _ -> 1 diff --git a/src/proto_alpha/lib_protocol/frozen_staker_repr.mli b/src/proto_alpha/lib_protocol/frozen_staker_repr.mli index 391e97e32ac45c0537ef6f76fe95dd6625a5b11b..5e13de5e3bad2c6ad8e554ba1c4e9ff7ecf086d8 100644 --- a/src/proto_alpha/lib_protocol/frozen_staker_repr.mli +++ b/src/proto_alpha/lib_protocol/frozen_staker_repr.mli @@ -5,10 +5,13 @@ (* *) (*****************************************************************************) -(** Adding and removing stake can be done from/toward a delegate, one - of its staker, or all its stakers at - once. We need to distinguish these cases to enforce the staking - over baking limit. *) +(** Adding and removing stake can be done from/toward the funds + - a delegate directly stakes, + - one of its stakers stakes, + - all its stakers stakes at once, + - or from the edge a delegate may have on its stakers rewards. + We need to distinguish these cases to enforce the staking over baking + limit. *) type t = private | Baker of Signature.public_key_hash (** The baker itself. *) | Single_staker of { @@ -17,9 +20,13 @@ type t = private } (** A single staker, cannot be the delegate. *) | Shared_between_stakers of {delegate : Signature.public_key_hash} (** The delegate's stakers simultaneously (delegate excluded). *) + | Baker_edge of Signature.public_key_hash + (** The baker edge over its stakers rewards. *) val baker : Signature.public_key_hash -> t +val baker_edge : Signature.public_key_hash -> t + val single_staker : staker:Contract_repr.t -> delegate:Signature.public_key_hash -> t diff --git a/src/proto_alpha/lib_protocol/shared_stake.ml b/src/proto_alpha/lib_protocol/shared_stake.ml index 5164e4a391df5380f7acda7310ba60b3c149a332..60b5888f9354df553a33805142612740bb874889 100644 --- a/src/proto_alpha/lib_protocol/shared_stake.ml +++ b/src/proto_alpha/lib_protocol/shared_stake.ml @@ -145,7 +145,7 @@ let pay_rewards ctxt ?active_stake ~source ~delegate rewards = Token.transfer ctxt source - (`Frozen_deposits (Frozen_staker_repr.baker delegate)) + (`Frozen_deposits (Frozen_staker_repr.baker_edge delegate)) to_baker_from_edge_over_stakers in let* ctxt, balance_updates_frozen_rewards_stakers = diff --git a/src/proto_alpha/lib_protocol/stake_storage.ml b/src/proto_alpha/lib_protocol/stake_storage.ml index 712a1aedf77059619ad99e6cf988e7220f3bc530..50c81bae2dbb3cb99be794f0938a70b5741123e3 100644 --- a/src/proto_alpha/lib_protocol/stake_storage.ml +++ b/src/proto_alpha/lib_protocol/stake_storage.ml @@ -166,6 +166,10 @@ let remove_frozen_stake_only_call_from_token ctxt staker amount = match staker with | Frozen_staker_repr.Baker delegate -> remove_own_frozen_stake ctxt delegate amount + | Frozen_staker_repr.Baker_edge delegate -> + (* This case should not happen because [Baker_edge] is only + intended to be used for rewards. *) + remove_own_frozen_stake ctxt delegate amount | Single_staker {staker = _; delegate} | Shared_between_stakers {delegate} -> remove_staked_frozen_stake ctxt delegate amount @@ -186,6 +190,8 @@ let add_frozen_stake_only_call_from_token ctxt staker amount = match staker with | Frozen_staker_repr.Baker delegate -> add_own_frozen_stake ctxt delegate amount + | Frozen_staker_repr.Baker_edge delegate -> + add_own_frozen_stake ctxt delegate amount | Single_staker {staker = _; delegate} | Shared_between_stakers {delegate} -> add_staked_frozen_stake ctxt delegate amount diff --git a/src/proto_alpha/lib_protocol/test/pbt/test_balance_updates_encoding.ml b/src/proto_alpha/lib_protocol/test/pbt/test_balance_updates_encoding.ml index 249aa18b70c39b2227d1cfd3362c722402ee77a2..9a9b165ea5fcb79270d432c02de1bc5a2f59f345 100644 --- a/src/proto_alpha/lib_protocol/test/pbt/test_balance_updates_encoding.ml +++ b/src/proto_alpha/lib_protocol/test/pbt/test_balance_updates_encoding.ml @@ -65,6 +65,7 @@ let frozen_staker = Frozen_staker_repr.single_staker ~staker:default_contract ~delegate:default_delegate; + Frozen_staker_repr.baker_edge default_delegate; ] let deposits = diff --git a/tezt/lib_tezos/operation_receipt.ml b/tezt/lib_tezos/operation_receipt.ml index 23019d9eff0086b70957ba52543e7ec2d2b88602..9452a6189c516292883e411c7b14c6ff2a26fd6f 100644 --- a/tezt/lib_tezos/operation_receipt.ml +++ b/tezt/lib_tezos/operation_receipt.ml @@ -48,7 +48,8 @@ let get_block_metadata client = module Balance_updates = struct type staker = | Delegate of {delegate : string; contract : string option} - | Baker of {baker : string} + | Baker_own_stake of {baker : string} + | Baker_edge of {baker : string} type t = { kind : string; @@ -89,9 +90,16 @@ module Balance_updates = struct JSON.(json |-> "contract" |> as_string_opt); }) | None -> ( - match JSON.(json |-> "baker" |> as_string_opt) with - | Some baker -> Some (Baker {baker}) - | None -> None)) + match + JSON.(json |-> "baker_own_stake" |> as_string_opt) + with + | Some baker -> Some (Baker_own_stake {baker}) + | None -> ( + match + JSON.(json |-> "baker_edge" |> as_string_opt) + with + | Some baker -> Some (Baker_edge {baker}) + | None -> None))) | None -> None in let delayed_operation_hash = @@ -116,7 +124,8 @@ module Balance_updates = struct "Delegate %s %s" delegate (Option.value ~default:"" contract) - | Baker {baker} -> Format.sprintf "Baker %s" baker + | Baker_own_stake {baker} -> Format.sprintf "Baker_own_stake %s" baker + | Baker_edge {baker} -> Format.sprintf "Baker_edge %s" baker in let staker_to_string = function | Some staker -> staker_to_string staker diff --git a/tezt/tests/adaptive_issuance.ml b/tezt/tests/adaptive_issuance.ml index bfb5c5ab8d5f0e5caefa02ae49a77df933eb35c9..0f5e2ef93df738dd685bb778d8c76459bdfde2a1 100644 --- a/tezt/tests/adaptive_issuance.ml +++ b/tezt/tests/adaptive_issuance.ml @@ -648,7 +648,9 @@ let test_staking = opr.kind = "freezer" && opr.category = Some "deposits" && opr.staker - = Some (Baker {baker = Constant.bootstrap2.public_key_hash})); + = Some + (Baker_own_stake + {baker = Constant.bootstrap2.public_key_hash})); change = -200000000; msg = "Frozen deposits decreased by 200tez"; }; @@ -722,7 +724,9 @@ let test_staking = (fun opr -> opr.kind = "freezer" && opr.staker - = Some (Baker {baker = Constant.bootstrap2.public_key_hash})); + = Some + (Baker_own_stake + {baker = Constant.bootstrap2.public_key_hash})); change = 400000000; msg = " Frozen balance deposit of 400tez"; }; @@ -881,7 +885,8 @@ let test_staking = && opr.category = Some "deposits" && opr.staker = Some - (Baker {baker = Constant.bootstrap2.public_key_hash})); + (Baker_own_stake + {baker = Constant.bootstrap2.public_key_hash})); change = amount_baker_share; msg = "Baker's frozen deposits increased by baker share"; }; @@ -918,7 +923,8 @@ let test_staking = && opr.category = Some "deposits" && opr.staker = Some - (Baker {baker = Constant.bootstrap2.public_key_hash})); + (Baker_edge + {baker = Constant.bootstrap2.public_key_hash})); change = amount_edge; msg = "Baker's frozen deposits increased by its edge on staker \ @@ -1174,7 +1180,8 @@ let test_staking = ~kind:"freezer" ~category:(Some "deposits") ~change:(-amount_slashed_from_baker_deposits) - ~staker:(Some (Baker {baker = Constant.bootstrap2.public_key_hash})) + ~staker: + (Some (Baker_own_stake {baker = Constant.bootstrap2.public_key_hash})) ~msg:"Slashed from baker deposits" ~delayed_operation_hash:None; check_opr @@ -1214,7 +1221,8 @@ let test_staking = ~kind:"freezer" ~category:(Some "deposits") ~change:(-amount_rewarded_from_baker_deposits) - ~staker:(Some (Baker {baker = Constant.bootstrap2.public_key_hash})) + ~staker: + (Some (Baker_own_stake {baker = Constant.bootstrap2.public_key_hash})) ~delayed_operation_hash:(Some denunciation_oph) ~msg:"Reward from baker deposits"; check_opr diff --git a/tezt/tests/expected/baker_test.ml/Alpha- Baker rewards.out b/tezt/tests/expected/baker_test.ml/Alpha- Baker rewards.out index 9b0b59f3e53cc02967056cfaf30ef1e041caacb0..d6488bf8922d2bfa499f4618e077ee89cc033795 100644 --- a/tezt/tests/expected/baker_test.ml/Alpha- Baker rewards.out +++ b/tezt/tests/expected/baker_test.ml/Alpha- Baker rewards.out @@ -21,19 +21,24 @@ [ { "kind": "minted", "category": "bootstrap", "change": "-20000000000000", "origin": "migration" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "400000000000", "origin": "migration" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "400000000000", "origin": "migration" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "400000000000", "origin": "migration" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "400000000000", "origin": "migration" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "400000000000", "origin": "migration" }, { "kind": "contract", "contract": "[PUBLIC_KEY_HASH]", @@ -53,7 +58,8 @@ { "kind": "minted", "category": "baking rewards", "change": "-333334", "origin": "block" }, { "kind": "freezer", "category": "deposits", - "staker": { "baker": "[PUBLIC_KEY_HASH]" }, + "staker": + { "baker_own_stake": "[PUBLIC_KEY_HASH]" }, "change": "333334", "origin": "block" }, { "kind": "minted", "category": "baking rewards", "change": "-2999999", "origin": "block" },