[Staking] Add issuance and budget traits in prep for Budget Split#11513
[Staking] Add issuance and budget traits in prep for Budget Split#11513
Conversation
| /// | ||
| /// [`budget::IssuanceCurve`] is the successor to this trait, decoupling issuance computation | ||
| /// from staking state. | ||
| pub trait EraPayout<Balance> { |
There was a problem hiding this comment.
Will be deprecated in the following PR
| /// Result of staker reward calculation. | ||
| #[derive(Debug, Clone, PartialEq, Eq)] | ||
| pub struct StakerRewardResult<Balance> { | ||
| /// Total payout for the validator (staking reward + commission). |
There was a problem hiding this comment.
| /// Total payout for the validator (staking reward + commission). | |
| /// Total payout for the validator (self-stake incentive + commission). |
There was a problem hiding this comment.
Its not self-stake incentive, but the reward based on their self stake from the stakers pot (shared with nominators).
| /// Calculate the reward weight for a validator based on their self-stake. | ||
| /// | ||
| /// Used for distributing validator self-stake incentive rewards proportionally. | ||
| fn calculate_validator_incentive_weight(self_stake: Balance) -> Balance; |
There was a problem hiding this comment.
Without any implementation yet, can you document how these two are meant to be used?
I think I figured it out last time by looking at the code, but have forgotten again, and not intuitive enough (= I am not smart enough) to reverse-engineer 🙈
I am not sure what is this weight + how it related to the validator_payout part of StakerRewardResult. It seems like our flow for validators and nominators are different, while they should not be?
There was a problem hiding this comment.
improved the doc, hopefully more now? 946ff6a
This trait combines staker reward split and incentive weight calculation. Could argue to split it as well, but a runtime can always create a custom impl that delegates to different strategies internally, so I think this is fine.
tldr for incentive weight: every validator gets reward proportional to their_weight / total_weight.
kianenigma
left a comment
There was a problem hiding this comment.
LGTM though seeing these traits independent and without any impl made me think a bit more if they are intuitive or not.
| - name: pallet-staking | ||
| bump: patch | ||
| - name: pallet-staking-async | ||
| bump: patch |
There was a problem hiding this comment.
do we want to put major here to make check-semver happier (E.g. https://github.com/paritytech/polkadot-sdk/actions/runs/23793615511/job/69335428077?pr=11513)?
There was a problem hiding this comment.
its moved to sp-staking and re-exported from the crates where it was removed. So should not break anything, right? Or am I missing something?
There was a problem hiding this comment.
I believe you're right but I don't think check-semver is too smart to catch it 😅 Now, it's not a mandatory job to merge, but will require some attention if (hopefully not) it doesn't make the cut for 2604. Do nothing or validate:false might be an option as well
There was a problem hiding this comment.
Don't wanna retrigger CI (it takes forever 😂 )
pallet_staking_async will bump to major in the following PRs. But I can keep an eye on this.
There was a problem hiding this comment.
totally fine by me - let's all 🙏 that CI Gods are gentle with us and we can merge now finally 😄
Stacked on #11513. Extracted from #10844. ## Overview Adds issuance drip and budget distribution to `pallet-dap`. DAP becomes a generic inflation engine: it mints new tokens on a configurable cadence and distributes them to registered budget recipients. No runtime behavior change: the existing chain configuration continues to mint via `EraPayout` trait in staking. DAP can be configured as a noop (cadence = 0 or empty budget). ## Changes ### pallet-dap - **Issuance drip**: `drip_issuance()` runs in `on_initialize`. Computes mint amount via `IssuanceCurve` (total issuance + elapsed time) and distributes to `BudgetRecipient`s per a governance-updatable `BudgetAllocation` map that must sum to 100%. - **Safety guards**: `MaxElapsedPerDrip` ceiling prevents over-minting if the chain stalls. First-block initialization skips drip to avoid minting for an unknown period. - **Buffer accounting**: buffer's share is deactivated on inflow (mint + `OnUnbalanced` slashes). - **`set_budget_allocation`** extrinsic (root-only): validates keys match registered recipients and percentages sum to exactly 100%. - **`BudgetRecipient` impl**: DAP exposes its buffer as a recipient (key: `"buffer"`). - **Migration**: `MigrateV1ToV2` seeds `LastIssuanceTimestamp` and `BudgetAllocation` for existing chains. Not wired up in WAH or other runtimes yet. ## TODOs - [x] Wire benchmark weights. ## In Later PR - Revert [these changes](9b388b2) --------- Co-authored-by: Paolo La Camera <paolo@parity.io>
Squashed commit of the following: commit 1b3ad0b Author: Alexandru Vasile <alexandru.vasile@parity.io> Date: Wed Apr 1 10:55:36 2026 +0000 Adjust metrics Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> commit 61d37db Author: Alexandru Vasile <alexandru.vasile@parity.io> Date: Wed Apr 1 09:58:38 2026 +0000 metrics: Bump some other buckets Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> commit ab2a221 Author: Alexandru Vasile <alexandru.vasile@parity.io> Date: Wed Apr 1 09:57:11 2026 +0000 collator-proto/metrics: Fix blindspot in collation fetch latency metrics Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io> commit 0d6888a Author: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Wed Apr 1 00:18:21 2026 +0200 Implement Budget Distribution logic in pallet-dap (#11527) Stacked on #11513. Extracted from #10844. ## Overview Adds issuance drip and budget distribution to `pallet-dap`. DAP becomes a generic inflation engine: it mints new tokens on a configurable cadence and distributes them to registered budget recipients. No runtime behavior change: the existing chain configuration continues to mint via `EraPayout` trait in staking. DAP can be configured as a noop (cadence = 0 or empty budget). ## Changes ### pallet-dap - **Issuance drip**: `drip_issuance()` runs in `on_initialize`. Computes mint amount via `IssuanceCurve` (total issuance + elapsed time) and distributes to `BudgetRecipient`s per a governance-updatable `BudgetAllocation` map that must sum to 100%. - **Safety guards**: `MaxElapsedPerDrip` ceiling prevents over-minting if the chain stalls. First-block initialization skips drip to avoid minting for an unknown period. - **Buffer accounting**: buffer's share is deactivated on inflow (mint + `OnUnbalanced` slashes). - **`set_budget_allocation`** extrinsic (root-only): validates keys match registered recipients and percentages sum to exactly 100%. - **`BudgetRecipient` impl**: DAP exposes its buffer as a recipient (key: `"buffer"`). - **Migration**: `MigrateV1ToV2` seeds `LastIssuanceTimestamp` and `BudgetAllocation` for existing chains. Not wired up in WAH or other runtimes yet. ## TODOs - [x] Wire benchmark weights. ## In Later PR - Revert [these changes](9b388b2) --------- Co-authored-by: Paolo La Camera <paolo@parity.io> commit 8b53323 Author: Javier Viola <363911+pepoviola@users.noreply.github.com> Date: Tue Mar 31 21:26:58 2026 +0200 bump zombienet version to v0.4.9 (#11569) This version move the internal monitor to a diff log target, eliminating the current spam of tracing logs. Thx! --------- Co-authored-by: Bastian Köcher <git@kchr.de> commit 129a48a Author: Ankan <10196091+Ank4n@users.noreply.github.com> Date: Tue Mar 31 19:06:21 2026 +0200 [Staking] Add issuance and budget traits in prep for Budget Split (#11513) # Overview Moves `EraPayout` trait to `sp-staking` and adds new traits for issuance, budget distribution, and reward calculation. Extracted changes from the main PR: #10844 Also see: #11512 ## Changes ### sp-staking - `EraPayout`: moved from `pallet-staking` and `pallet-staking-async` to `sp-staking`, eliminating the duplicate definitions. - `budget` module: stake independent traits: - `IssuanceCurve`: successor to `EraPayout`, computes issuance from total supply + elapsed time (no staking state dependency). - `BudgetRecipient` / `BudgetRecipientList`: register pot accounts for inflation distribution. Runtime wires as a tuple. - `BudgetKey`: bounded identifier for budget categories. - `StakerRewardCalculator`: trait for calculating validator incentive weights and staker reward splits. ### pallet-staking / pallet-staking-async - Removed local `EraPayout` definitions, re-exported from `sp-staking`. --------- Co-authored-by: Paolo La Camera <paolo@parity.io> commit 10a517e Author: Dmitry Markin <dmitry@markin.tech> Date: Tue Mar 31 18:37:01 2026 +0300 Implement `bitswap_v1_get` RPC method (#11521) Implement `bitswap_v1_get` RPC method according to the [spec](https://github.com/paritytech/json-rpc-interface-spec/blob/main/src/api/bitswap_v1_get.md). --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Lukasz Rubaszewski <117115317+lrubasze@users.noreply.github.com> commit 2c99855 Author: Paolo La Camera <paolo@parity.io> Date: Tue Mar 31 16:42:03 2026 +0200 Fix can_inc_consumer check blocking session key rotation in pallet_session (#11573) Check consumer capacity only when we actually increment the consumer count (first-time local registration or external-to-local transition), not on key rotation. Notes: 1. setting keys via `stakingRcClient` didn't suffer of this issue since by-pass `do_set_keys()` 2. setting and purging keys via session pallet directly on RC is deprecated and will be removed soon - but better safe than sorry till then --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> commit de0a245 Author: Luka Ciric <luka.ciric2106@gmail.com> Date: Tue Mar 31 16:39:48 2026 +0200 Raise offence queue eras bound limit (#11435) Fixes a bug where **OffenceQueueEras** bound (BondingDuration) was incorrect when `SlashDeferDuration=0`. The oldest reportable offence era formula allowed more eras than the bound could hold. --------- Co-authored-by: cmd[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Ankan <10196091+Ank4n@users.noreply.github.com> Signed-off-by: Alexandru Vasile <alexandru.vasile@parity.io>
…1513) # Overview Moves `EraPayout` trait to `sp-staking` and adds new traits for issuance, budget distribution, and reward calculation. Extracted changes from the main PR: #10844 Also see: #11512 ## Changes ### sp-staking - `EraPayout`: moved from `pallet-staking` and `pallet-staking-async` to `sp-staking`, eliminating the duplicate definitions. - `budget` module: stake independent traits: - `IssuanceCurve`: successor to `EraPayout`, computes issuance from total supply + elapsed time (no staking state dependency). - `BudgetRecipient` / `BudgetRecipientList`: register pot accounts for inflation distribution. Runtime wires as a tuple. - `BudgetKey`: bounded identifier for budget categories. - `StakerRewardCalculator`: trait for calculating validator incentive weights and staker reward splits. ### pallet-staking / pallet-staking-async - Removed local `EraPayout` definitions, re-exported from `sp-staking`. --------- Co-authored-by: Paolo La Camera <paolo@parity.io>
Overview
Moves
EraPayouttrait tosp-stakingand adds new traits for issuance, budget distribution, and reward calculation.Extracted changes from the main PR: #10844
Also see: #11512
Changes
sp-staking
EraPayout: moved frompallet-stakingandpallet-staking-asynctosp-staking, eliminating the duplicate definitions.budgetmodule: stake independent traits:IssuanceCurve: successor toEraPayout, computes issuance from total supply + elapsed time (no staking state dependency).BudgetRecipient/BudgetRecipientList: register pot accounts for inflation distribution. Runtime wires as a tuple.BudgetKey: bounded identifier for budget categories.StakerRewardCalculator: trait for calculating validator incentive weights and staker reward splits.pallet-staking / pallet-staking-async
EraPayoutdefinitions, re-exported fromsp-staking.