From b4579abcd9c92d89741f0bdcc4e4f43186a4169f Mon Sep 17 00:00:00 2001 From: Imod7 Date: Tue, 6 Jan 2026 13:24:17 +0100 Subject: [PATCH] fix: unappliedSlashes per era --- .../PalletsStakingProgressService.spec.ts | 12 +++++---- .../pallets/PalletsStakingProgressService.ts | 25 ++++++++++++++++--- .../pallets/stakingProgress789629.json | 2 +- .../pallets/stakingProgressPostAhm.json | 2 +- .../stakingProgressUnappliedSlashes.json | 11 ++++---- ...takingProgressUnappliedSlashesPostAHM.json | 11 ++++---- 6 files changed, 42 insertions(+), 21 deletions(-) diff --git a/src/services/pallets/PalletsStakingProgressService.spec.ts b/src/services/pallets/PalletsStakingProgressService.spec.ts index 57a525bed..945abdeef 100644 --- a/src/services/pallets/PalletsStakingProgressService.spec.ts +++ b/src/services/pallets/PalletsStakingProgressService.spec.ts @@ -26,7 +26,7 @@ import { InternalServerError } from 'http-errors'; import { ApiPromiseRegistry } from '../../apiRegistry'; import { sanitizeNumbers } from '../../sanitize/sanitizeNumbers'; -import { polkadotRegistry } from '../../test-helpers/registries'; +import { polkadotRegistry, polkadotRegistryV1003000 } from '../../test-helpers/registries'; import { activeEraAt, blockHash100000, @@ -123,23 +123,25 @@ const mockApi = { } as unknown as ApiPromise; const unappliedSlashes = { - validator: '5CD2Q2EnKaKvjWza3ufMxaXizBTTDgm9kPB3DCZ4VA9j7Ud6', + validator: '19KYMVrBMbQB4161YiN6jMsqoT6uzKHpsuXNVYR3FBFHrvW', own: '0', - others: [['5GxDBrTuFgCAN49xrpRFWJiA969R2Ny5NnTa8cSPBh8hWHY9', '6902377436592']], + others: [['15tWLBiy7TTdobAUpTUFeTYJzi94igXDTHC4HuRjjnADgZuw', '6902377436592']], reporters: [], payout: '345118871829', toJSON: function () { return { validator: this.validator, own: this.own, - others: this.others.map(([account, amount]) => ({ account, amount })), + others: this.others.map(([account, amount]) => [account, amount]), reporters: this.reporters, payout: this.payout, }; }, }; const unappliedSlashesEntriesUnappliedSlashes = () => { - return Promise.resolve([['5640', unappliedSlashes]]); + return Promise.resolve([ + [{ args: [5640] }, polkadotRegistryV1003000.createType('Option', unappliedSlashes)], + ]); }; const mockHistoricApiUnappliedSlashes = { diff --git a/src/services/pallets/PalletsStakingProgressService.ts b/src/services/pallets/PalletsStakingProgressService.ts index b4c4002f4..ec7d45240 100644 --- a/src/services/pallets/PalletsStakingProgressService.ts +++ b/src/services/pallets/PalletsStakingProgressService.ts @@ -16,7 +16,9 @@ import { ApiPromise } from '@polkadot/api'; import { ApiDecoration } from '@polkadot/api/types'; +import { Option, StorageKey } from '@polkadot/types'; import { BlockHash, EraIndex } from '@polkadot/types/interfaces'; +import { PalletStakingAsyncUnappliedSlash } from '@polkadot/types/lookup'; import { AnyJson, ITuple } from '@polkadot/types/types'; import { u32, u64, Vec } from '@polkadot/types-codec'; import BN from 'bn.js'; @@ -104,7 +106,8 @@ export class PalletsStakingProgressService extends AbstractService { const [eraElectionStatus, { eraLength, eraProgress, sessionLength, sessionProgress, activeEra }] = await Promise.all([eraElectionPromise, deriveSessionAndEra]); - const unappliedSlashesAtActiveEra = await historicApi.query.staking.unappliedSlashes.entries(); + const unappliedSlashesAtActiveEra: [StorageKey<[u32]>, Option][] = + await historicApi.query.staking.unappliedSlashes.entries(); const currentBlockNumber = number.toBn(); @@ -120,10 +123,24 @@ export class PalletsStakingProgressService extends AbstractService { nextSessionEstimate: nextSession.toString(10), unappliedSlashes: Array.isArray(unappliedSlashesAtActiveEra) && unappliedSlashesAtActiveEra.length > 0 - ? unappliedSlashesAtActiveEra.map(([_key, slash]) => - slash && Object.keys(slash).length > 0 ? slash.toJSON() : {}, - ) + ? unappliedSlashesAtActiveEra.flatMap(([key, slashOption]) => { + if (!slashOption || !slashOption.isSome) return []; + const slashes: PalletStakingAsyncUnappliedSlash = slashOption.unwrap(); + const era = key.args[0]?.toString(); + return Array.isArray(slashes) + ? slashes.map((slash: PalletStakingAsyncUnappliedSlash) => ({ + era, + ...slash.toJSON(), + })) + : [ + { + era, + ...slashes.toJSON(), + }, + ]; + }) : ([] as AnyJson[]), + validatorSet: validators && validators.length ? validators.map((accountId) => accountId.toString()) : [], }; diff --git a/src/services/test-helpers/responses/pallets/stakingProgress789629.json b/src/services/test-helpers/responses/pallets/stakingProgress789629.json index 4aa0baab9..c19b5384c 100644 --- a/src/services/test-helpers/responses/pallets/stakingProgress789629.json +++ b/src/services/test-helpers/responses/pallets/stakingProgress789629.json @@ -6,7 +6,7 @@ "activeEra": "49", "forceEra": "NotForcing", "nextSessionEstimate": "791868", - "unappliedSlashes": [{}], + "unappliedSlashes": [], "nextActiveEraEstimate": "803868", "electionStatus": { "status": { diff --git a/src/services/test-helpers/responses/pallets/stakingProgressPostAhm.json b/src/services/test-helpers/responses/pallets/stakingProgressPostAhm.json index 9d89f5565..70aa609c0 100644 --- a/src/services/test-helpers/responses/pallets/stakingProgressPostAhm.json +++ b/src/services/test-helpers/responses/pallets/stakingProgressPostAhm.json @@ -6,7 +6,7 @@ "activeEra": "49", "forceEra": "NotForcing", "nextSessionEstimate": "789999", - "unappliedSlashes": [{}], + "unappliedSlashes": [], "nextActiveEraEstimate": "-20369001", "electionStatus": { "status": { diff --git a/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json index a3b08f214..099d7aea7 100644 --- a/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json +++ b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json @@ -8,14 +8,15 @@ "nextSessionEstimate": "791868", "unappliedSlashes": [ { - "validator": "5CD2Q2EnKaKvjWza3ufMxaXizBTTDgm9kPB3DCZ4VA9j7Ud6", + "era": "5640", + "validator": "19KYMVrBMbQB4161YiN6jMsqoT6uzKHpsuXNVYR3FBFHrvW", "own": "0", "others": [ - { + [ - "account": "5GxDBrTuFgCAN49xrpRFWJiA969R2Ny5NnTa8cSPBh8hWHY9", - "amount": "6902377436592" - } + "15tWLBiy7TTdobAUpTUFeTYJzi94igXDTHC4HuRjjnADgZuw", + "6902377436592" + ] ], "reporters": [], "payout": "345118871829" diff --git a/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashesPostAHM.json b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashesPostAHM.json index 707cb0e69..cddccdd0b 100644 --- a/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashesPostAHM.json +++ b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashesPostAHM.json @@ -8,14 +8,15 @@ "nextSessionEstimate": "789999", "unappliedSlashes": [ { - "validator": "5CD2Q2EnKaKvjWza3ufMxaXizBTTDgm9kPB3DCZ4VA9j7Ud6", + "era": "5640", + "validator": "19KYMVrBMbQB4161YiN6jMsqoT6uzKHpsuXNVYR3FBFHrvW", "own": "0", "others": [ - { + [ - "account": "5GxDBrTuFgCAN49xrpRFWJiA969R2Ny5NnTa8cSPBh8hWHY9", - "amount": "6902377436592" - } + "15tWLBiy7TTdobAUpTUFeTYJzi94igXDTHC4HuRjjnADgZuw", + "6902377436592" + ] ], "reporters": [], "payout": "345118871829"