@pezkuwi/api-derive 16.5.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/README.md +30 -0
  2. package/build/accounts/accountId.d.ts +17 -0
  3. package/build/accounts/flags.d.ts +29 -0
  4. package/build/accounts/idAndIndex.d.ts +15 -0
  5. package/build/accounts/idToIndex.d.ts +16 -0
  6. package/build/accounts/identity.d.ts +48 -0
  7. package/build/accounts/index.d.ts +8 -0
  8. package/build/accounts/indexToId.d.ts +15 -0
  9. package/build/accounts/indexes.d.ts +16 -0
  10. package/build/accounts/info.d.ts +18 -0
  11. package/build/accounts/types.d.ts +39 -0
  12. package/build/alliance/index.d.ts +70 -0
  13. package/build/augment.d.ts +1 -0
  14. package/build/bagsList/get.d.ts +12 -0
  15. package/build/bagsList/getExpanded.d.ts +16 -0
  16. package/build/bagsList/index.d.ts +3 -0
  17. package/build/bagsList/listNodes.d.ts +9 -0
  18. package/build/bagsList/types.d.ts +13 -0
  19. package/build/bagsList/util.d.ts +2 -0
  20. package/build/balances/account.d.ts +17 -0
  21. package/build/balances/all.d.ts +20 -0
  22. package/build/balances/index.d.ts +20 -0
  23. package/build/balances/types.d.ts +69 -0
  24. package/build/balances/votingBalances.d.ts +15 -0
  25. package/build/bounties/bounties.d.ts +12 -0
  26. package/build/bounties/helpers/filterBountyProposals.d.ts +2 -0
  27. package/build/bounties/index.d.ts +1 -0
  28. package/build/bundle.d.ts +9 -0
  29. package/build/chain/bestNumber.d.ts +11 -0
  30. package/build/chain/bestNumberFinalized.d.ts +12 -0
  31. package/build/chain/bestNumberLag.d.ts +15 -0
  32. package/build/chain/getBlock.d.ts +15 -0
  33. package/build/chain/getBlockByNumber.d.ts +16 -0
  34. package/build/chain/getHeader.d.ts +16 -0
  35. package/build/chain/index.d.ts +10 -0
  36. package/build/chain/subscribeFinalizedBlocks.d.ts +14 -0
  37. package/build/chain/subscribeFinalizedHeads.d.ts +22 -0
  38. package/build/chain/subscribeNewBlocks.d.ts +14 -0
  39. package/build/chain/subscribeNewHeads.d.ts +15 -0
  40. package/build/chain/util.d.ts +9 -0
  41. package/build/collective/helpers.d.ts +6 -0
  42. package/build/collective/index.d.ts +3 -0
  43. package/build/collective/members.d.ts +2 -0
  44. package/build/collective/prime.d.ts +2 -0
  45. package/build/collective/proposals.d.ts +6 -0
  46. package/build/collective/types.d.ts +19 -0
  47. package/build/contracts/fees.d.ts +14 -0
  48. package/build/contracts/index.d.ts +1 -0
  49. package/build/council/index.d.ts +72 -0
  50. package/build/council/types.d.ts +6 -0
  51. package/build/council/votes.d.ts +11 -0
  52. package/build/council/votesOf.d.ts +16 -0
  53. package/build/crowdloan/childKey.d.ts +15 -0
  54. package/build/crowdloan/contributions.d.ts +14 -0
  55. package/build/crowdloan/index.d.ts +3 -0
  56. package/build/crowdloan/ownContributions.d.ts +15 -0
  57. package/build/crowdloan/types.d.ts +6 -0
  58. package/build/crowdloan/util.d.ts +10 -0
  59. package/build/democracy/dispatchQueue.d.ts +12 -0
  60. package/build/democracy/index.d.ts +11 -0
  61. package/build/democracy/locks.d.ts +14 -0
  62. package/build/democracy/nextExternal.d.ts +12 -0
  63. package/build/democracy/preimages.d.ts +24 -0
  64. package/build/democracy/proposals.d.ts +12 -0
  65. package/build/democracy/referendumIds.d.ts +12 -0
  66. package/build/democracy/referendums.d.ts +11 -0
  67. package/build/democracy/referendumsActive.d.ts +12 -0
  68. package/build/democracy/referendumsFinished.d.ts +15 -0
  69. package/build/democracy/referendumsInfo.d.ts +23 -0
  70. package/build/democracy/sqrtElectorate.d.ts +13 -0
  71. package/build/democracy/types.d.ts +70 -0
  72. package/build/democracy/util.d.ts +18 -0
  73. package/build/derive.d.ts +52 -0
  74. package/build/elections/index.d.ts +1 -0
  75. package/build/elections/info.d.ts +14 -0
  76. package/build/elections/types.d.ts +18 -0
  77. package/build/imOnline/index.d.ts +1 -0
  78. package/build/imOnline/receivedHeartbeats.d.ts +13 -0
  79. package/build/index.d.ts +2 -0
  80. package/build/membership/index.d.ts +70 -0
  81. package/build/packageDetect.d.ts +1 -0
  82. package/build/packageInfo.d.ts +6 -0
  83. package/build/parachains/index.d.ts +2 -0
  84. package/build/parachains/info.d.ts +19 -0
  85. package/build/parachains/overview.d.ts +15 -0
  86. package/build/parachains/types.d.ts +38 -0
  87. package/build/parachains/util.d.ts +3 -0
  88. package/build/session/index.d.ts +3 -0
  89. package/build/session/indexes.d.ts +15 -0
  90. package/build/session/info.d.ts +13 -0
  91. package/build/session/progress.d.ts +47 -0
  92. package/build/session/types.d.ts +19 -0
  93. package/build/society/candidates.d.ts +12 -0
  94. package/build/society/index.d.ts +4 -0
  95. package/build/society/info.d.ts +12 -0
  96. package/build/society/member.d.ts +14 -0
  97. package/build/society/members.d.ts +14 -0
  98. package/build/society/types.d.ts +27 -0
  99. package/build/staking/account.d.ts +31 -0
  100. package/build/staking/cache.d.ts +12 -0
  101. package/build/staking/currentPoints.d.ts +13 -0
  102. package/build/staking/electedInfo.d.ts +23 -0
  103. package/build/staking/erasExposure.d.ts +30 -0
  104. package/build/staking/erasHistoric.d.ts +8 -0
  105. package/build/staking/erasPoints.d.ts +18 -0
  106. package/build/staking/erasPrefs.d.ts +27 -0
  107. package/build/staking/erasRewards.d.ts +14 -0
  108. package/build/staking/erasSlashes.d.ts +26 -0
  109. package/build/staking/index.d.ts +22 -0
  110. package/build/staking/keys.d.ts +35 -0
  111. package/build/staking/overview.d.ts +19 -0
  112. package/build/staking/ownExposure.d.ts +37 -0
  113. package/build/staking/ownSlashes.d.ts +35 -0
  114. package/build/staking/query.d.ts +31 -0
  115. package/build/staking/stakerExposure.d.ts +33 -0
  116. package/build/staking/stakerPoints.d.ts +22 -0
  117. package/build/staking/stakerPrefs.d.ts +24 -0
  118. package/build/staking/stakerRewards.d.ts +49 -0
  119. package/build/staking/stakerSlashes.d.ts +22 -0
  120. package/build/staking/stashes.d.ts +16 -0
  121. package/build/staking/types.d.ts +139 -0
  122. package/build/staking/util.d.ts +14 -0
  123. package/build/staking/validators.d.ts +33 -0
  124. package/build/staking/waitingInfo.d.ts +16 -0
  125. package/build/technicalCommittee/index.d.ts +70 -0
  126. package/build/treasury/index.d.ts +1 -0
  127. package/build/treasury/proposals.d.ts +12 -0
  128. package/build/tx/constants.d.ts +5 -0
  129. package/build/tx/events.d.ts +22 -0
  130. package/build/tx/extrinsicInfo.d.ts +61 -0
  131. package/build/tx/index.d.ts +3 -0
  132. package/build/tx/signingInfo.d.ts +25 -0
  133. package/build/type/HeaderExtended.d.ts +4 -0
  134. package/build/type/SignedBlockExtended.d.ts +4 -0
  135. package/build/type/index.d.ts +2 -0
  136. package/build/type/types.d.ts +15 -0
  137. package/build/type/util.d.ts +2 -0
  138. package/build/types.d.ts +79 -0
  139. package/build/util/approvalFlagsToBools.d.ts +4 -0
  140. package/build/util/blockNumber.d.ts +7 -0
  141. package/build/util/cache.d.ts +4 -0
  142. package/build/util/cacheImpl.d.ts +3 -0
  143. package/build/util/first.d.ts +4 -0
  144. package/build/util/index.d.ts +7 -0
  145. package/build/util/lazy.d.ts +4 -0
  146. package/build/util/types.d.ts +6 -0
  147. package/package.json +42 -0
  148. package/src/accounts/accountId.ts +44 -0
  149. package/src/accounts/flags.ts +90 -0
  150. package/src/accounts/idAndIndex.ts +51 -0
  151. package/src/accounts/idToIndex.ts +31 -0
  152. package/src/accounts/identity.ts +235 -0
  153. package/src/accounts/index.ts +11 -0
  154. package/src/accounts/indexToId.ts +33 -0
  155. package/src/accounts/indexes.ts +56 -0
  156. package/src/accounts/info.ts +58 -0
  157. package/src/accounts/types.ts +48 -0
  158. package/src/alliance/index.ts +76 -0
  159. package/src/augment.ts +4 -0
  160. package/src/bagsList/get.ts +79 -0
  161. package/src/bagsList/getExpanded.ts +41 -0
  162. package/src/bagsList/index.ts +6 -0
  163. package/src/bagsList/listNodes.ts +50 -0
  164. package/src/bagsList/types.ts +18 -0
  165. package/src/bagsList/util.ts +14 -0
  166. package/src/balances/account.ts +210 -0
  167. package/src/balances/all.ts +246 -0
  168. package/src/balances/index.ts +26 -0
  169. package/src/balances/types.ts +79 -0
  170. package/src/balances/votingBalances.ts +33 -0
  171. package/src/bounties/bounties.spec.ts +162 -0
  172. package/src/bounties/bounties.ts +76 -0
  173. package/src/bounties/helpers/filterBountyProposals.ts +13 -0
  174. package/src/bounties/index.ts +4 -0
  175. package/src/bundle.ts +140 -0
  176. package/src/chain/bestNumber.ts +21 -0
  177. package/src/chain/bestNumberFinalized.ts +22 -0
  178. package/src/chain/bestNumberLag.ts +33 -0
  179. package/src/chain/getBlock.ts +43 -0
  180. package/src/chain/getBlockByNumber.ts +30 -0
  181. package/src/chain/getHeader.ts +37 -0
  182. package/src/chain/index.ts +13 -0
  183. package/src/chain/subscribeFinalizedBlocks.ts +30 -0
  184. package/src/chain/subscribeFinalizedHeads.ts +62 -0
  185. package/src/chain/subscribeNewBlocks.ts +30 -0
  186. package/src/chain/subscribeNewHeads.ts +38 -0
  187. package/src/chain/util.ts +112 -0
  188. package/src/checkTypes.manual.ts +8 -0
  189. package/src/collective/helpers.ts +36 -0
  190. package/src/collective/index.ts +6 -0
  191. package/src/collective/members.ts +8 -0
  192. package/src/collective/prime.ts +25 -0
  193. package/src/collective/proposals.ts +73 -0
  194. package/src/collective/types.ts +30 -0
  195. package/src/contracts/fees.ts +61 -0
  196. package/src/contracts/index.ts +4 -0
  197. package/src/council/index.ts +79 -0
  198. package/src/council/types.ts +11 -0
  199. package/src/council/votes.ts +97 -0
  200. package/src/council/votesOf.ts +35 -0
  201. package/src/crowdloan/childKey.ts +57 -0
  202. package/src/crowdloan/contributions.ts +142 -0
  203. package/src/crowdloan/index.ts +6 -0
  204. package/src/crowdloan/ownContributions.ts +81 -0
  205. package/src/crowdloan/types.ts +11 -0
  206. package/src/crowdloan/util.ts +33 -0
  207. package/src/democracy/dispatchQueue.ts +158 -0
  208. package/src/democracy/index.ts +14 -0
  209. package/src/democracy/locks.ts +114 -0
  210. package/src/democracy/nextExternal.ts +49 -0
  211. package/src/democracy/preimages.ts +171 -0
  212. package/src/democracy/proposals.ts +81 -0
  213. package/src/democracy/referendumIds.ts +37 -0
  214. package/src/democracy/referendums.ts +39 -0
  215. package/src/democracy/referendumsActive.ts +30 -0
  216. package/src/democracy/referendumsFinished.ts +37 -0
  217. package/src/democracy/referendumsInfo.ts +181 -0
  218. package/src/democracy/sqrtElectorate.ts +29 -0
  219. package/src/democracy/types.ts +84 -0
  220. package/src/democracy/util.ts +166 -0
  221. package/src/derive.ts +41 -0
  222. package/src/elections/index.ts +4 -0
  223. package/src/elections/info.ts +126 -0
  224. package/src/elections/types.ts +22 -0
  225. package/src/imOnline/index.ts +4 -0
  226. package/src/imOnline/receivedHeartbeats.ts +65 -0
  227. package/src/index.spec.ts +103 -0
  228. package/src/index.ts +6 -0
  229. package/src/membership/index.ts +76 -0
  230. package/src/mod.ts +4 -0
  231. package/src/packageDetect.ts +11 -0
  232. package/src/packageInfo.ts +6 -0
  233. package/src/parachains/index.ts +5 -0
  234. package/src/parachains/info.ts +111 -0
  235. package/src/parachains/overview.ts +63 -0
  236. package/src/parachains/types.ts +46 -0
  237. package/src/parachains/util.ts +11 -0
  238. package/src/session/index.ts +6 -0
  239. package/src/session/indexes.ts +90 -0
  240. package/src/session/info.ts +39 -0
  241. package/src/session/progress.ts +130 -0
  242. package/src/session/types.ts +25 -0
  243. package/src/society/candidates.ts +71 -0
  244. package/src/society/index.ts +7 -0
  245. package/src/society/info.ts +50 -0
  246. package/src/society/member.ts +28 -0
  247. package/src/society/members.ts +107 -0
  248. package/src/society/types.ts +33 -0
  249. package/src/staking/account.ts +112 -0
  250. package/src/staking/cache.ts +48 -0
  251. package/src/staking/currentPoints.ts +28 -0
  252. package/src/staking/electedInfo.ts +54 -0
  253. package/src/staking/erasExposure.ts +105 -0
  254. package/src/staking/erasHistoric.ts +47 -0
  255. package/src/staking/erasPoints.ts +67 -0
  256. package/src/staking/erasPrefs.ts +63 -0
  257. package/src/staking/erasRewards.ts +52 -0
  258. package/src/staking/erasSlashes.ts +69 -0
  259. package/src/staking/index.ts +25 -0
  260. package/src/staking/keys.ts +86 -0
  261. package/src/staking/overview.ts +42 -0
  262. package/src/staking/ownExposure.ts +83 -0
  263. package/src/staking/ownSlashes.ts +68 -0
  264. package/src/staking/query.ts +230 -0
  265. package/src/staking/stakerExposure.ts +78 -0
  266. package/src/staking/stakerPoints.ts +46 -0
  267. package/src/staking/stakerPrefs.ts +45 -0
  268. package/src/staking/stakerRewards.ts +298 -0
  269. package/src/staking/stakerSlashes.ts +45 -0
  270. package/src/staking/stashes.ts +55 -0
  271. package/src/staking/types.ts +174 -0
  272. package/src/staking/util.ts +94 -0
  273. package/src/staking/validators.ts +82 -0
  274. package/src/staking/waitingInfo.ts +45 -0
  275. package/src/technicalCommittee/index.ts +76 -0
  276. package/src/test/bountyFactory.ts +39 -0
  277. package/src/test/bytesFactory.ts +15 -0
  278. package/src/test/helpers.ts +23 -0
  279. package/src/test/proposalFactory.ts +25 -0
  280. package/src/treasury/index.ts +4 -0
  281. package/src/treasury/proposals.ts +109 -0
  282. package/src/tx/constants.ts +13 -0
  283. package/src/tx/events.ts +43 -0
  284. package/src/tx/extrinsicInfo.ts +123 -0
  285. package/src/tx/index.ts +6 -0
  286. package/src/tx/signingInfo.ts +129 -0
  287. package/src/type/HeaderExtended.ts +33 -0
  288. package/src/type/SignedBlockExtended.ts +75 -0
  289. package/src/type/index.ts +5 -0
  290. package/src/type/types.ts +21 -0
  291. package/src/type/util.ts +45 -0
  292. package/src/types.ts +97 -0
  293. package/src/util/approvalFlagToBools.spec.ts +37 -0
  294. package/src/util/approvalFlagsToBools.ts +26 -0
  295. package/src/util/blockNumber.ts +15 -0
  296. package/src/util/cache.ts +65 -0
  297. package/src/util/cacheImpl.ts +30 -0
  298. package/src/util/first.ts +20 -0
  299. package/src/util/index.ts +13 -0
  300. package/src/util/lazy.ts +16 -0
  301. package/src/util/types.ts +9 -0
  302. package/tsconfig.build.json +21 -0
  303. package/tsconfig.build.tsbuildinfo +1 -0
  304. package/tsconfig.spec.json +27 -0
@@ -0,0 +1,54 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { AccountId } from '@pezkuwi/types/interfaces';
6
+ import type { DeriveApi, DeriveStakingElected, StakingQueryFlags } from '../types.js';
7
+
8
+ import { map, switchMap } from 'rxjs';
9
+
10
+ import { arrayFlatten } from '@pezkuwi/util';
11
+
12
+ import { memo } from '../util/index.js';
13
+
14
+ const DEFAULT_FLAGS = { withController: true, withExposure: true, withPrefs: true };
15
+
16
+ function combineAccounts (nextElected: AccountId[], validators: AccountId[]): AccountId[] {
17
+ return arrayFlatten([nextElected, validators.filter((v) => !nextElected.find((n) => n.eq(v)))]);
18
+ }
19
+
20
+ /**
21
+ * @name electedInfo
22
+ * @param {StakingQueryFlags} flags? (Optional) Query flags to filter the staking data.
23
+ * @param {number} page? (Optional) The page index for paginated results.
24
+ * @description Retrieves detailed staking information about the next elected validators and their associated staking data.
25
+ * @example
26
+ * ```javascript
27
+ * const { nextElected, validators, info } =
28
+ * await api.derive.staking.electedInfo();
29
+ * console.log(
30
+ * "Next Elected Validators:",
31
+ * nextElected.map((acc) => acc.toString())
32
+ * );
33
+ * console.log(
34
+ * "Current Validators:",
35
+ * validators.map((acc) => acc.toString())
36
+ * );
37
+ * console.log("Validator Staking Info:", info);
38
+ * ```
39
+ */
40
+ export function electedInfo (instanceId: string, api: DeriveApi): (flags?: StakingQueryFlags, page?: number) => Observable<DeriveStakingElected> {
41
+ return memo(instanceId, (flags: StakingQueryFlags = DEFAULT_FLAGS, page = 0): Observable<DeriveStakingElected> =>
42
+ api.derive.staking.validators().pipe(
43
+ switchMap(({ nextElected, validators }): Observable<DeriveStakingElected> =>
44
+ api.derive.staking.queryMulti(combineAccounts(nextElected, validators), flags, page).pipe(
45
+ map((info): DeriveStakingElected => ({
46
+ info,
47
+ nextElected,
48
+ validators
49
+ }))
50
+ )
51
+ )
52
+ )
53
+ );
54
+ }
@@ -0,0 +1,105 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { Option, StorageKey, u32 } from '@pezkuwi/types';
6
+ import type { AccountId, AccountId32, EraIndex } from '@pezkuwi/types/interfaces';
7
+ import type { SpStakingExposure, SpStakingExposurePage } from '@pezkuwi/types/lookup';
8
+ import type { DeriveApi, DeriveEraExposurePaged, DeriveEraNominatorExposure, DeriveEraValidatorExposure, DeriveEraValidatorExposurePaged } from '../types.js';
9
+
10
+ import { map, of } from 'rxjs';
11
+
12
+ import { memo } from '../util/index.js';
13
+ import { getEraCache, setEraCache } from './cache.js';
14
+ import { combineEras, erasHistoricApply, singleEra } from './util.js';
15
+
16
+ type KeysAndExposures = [StorageKey<[EraIndex, AccountId]>, SpStakingExposure][];
17
+ type KeysAndExposuresPaged = [StorageKey<[u32, AccountId32, u32]>, Option<SpStakingExposurePage>][];
18
+
19
+ const CACHE_KEY = 'eraExposure';
20
+
21
+ function mapStakersClipped (era: EraIndex, stakers: KeysAndExposures): DeriveEraExposurePaged {
22
+ const nominators: DeriveEraNominatorExposure = {};
23
+ const validators: DeriveEraValidatorExposure = {};
24
+
25
+ stakers.forEach(([key, exposure]): void => {
26
+ const validatorId = key.args[1].toString();
27
+
28
+ validators[validatorId] = exposure;
29
+
30
+ exposure.others.forEach(({ who }, validatorIndex): void => {
31
+ const nominatorId = who.toString();
32
+
33
+ nominators[nominatorId] = nominators[nominatorId] || [];
34
+ nominators[nominatorId].push({ validatorId, validatorIndex });
35
+ });
36
+ });
37
+
38
+ return { era, nominators, validators };
39
+ }
40
+
41
+ function mapStakersPaged (era: EraIndex, stakers: KeysAndExposuresPaged): DeriveEraExposurePaged {
42
+ const nominators: DeriveEraNominatorExposure = {};
43
+ const validators: DeriveEraValidatorExposurePaged = {};
44
+
45
+ stakers.forEach(([key, exposureOpt]): void => {
46
+ if (exposureOpt.isSome) {
47
+ const validatorId = key.args[1].toString();
48
+ const exposure = exposureOpt.unwrap();
49
+
50
+ validators[validatorId] = exposure;
51
+
52
+ exposure.others.forEach(({ who }, validatorIndex): void => {
53
+ const nominatorId = who.toString();
54
+
55
+ nominators[nominatorId] = nominators[nominatorId] || [];
56
+ nominators[nominatorId].push({ validatorId, validatorIndex });
57
+ });
58
+ }
59
+ });
60
+
61
+ return { era, nominators, validators };
62
+ }
63
+
64
+ /**
65
+ * erasStakersClipped will be deprecated and replaced with erasStakersPaged. Therefore support is given for both
66
+ * storage queries until erasStakersClipped has been completely out of use.
67
+ */
68
+ export function _eraExposure (instanceId: string, api: DeriveApi): (era: EraIndex, withActive?: boolean) => Observable<DeriveEraExposurePaged> {
69
+ return memo(instanceId, (era: EraIndex, withActive = false): Observable<DeriveEraExposurePaged> => {
70
+ const [cacheKey, cached] = getEraCache<DeriveEraExposurePaged>(CACHE_KEY, era, withActive);
71
+
72
+ return cached
73
+ ? of(cached)
74
+ : api.query.staking.erasStakersPaged
75
+ ? api.query.staking.erasStakersPaged.entries<Option<SpStakingExposurePage>>(era).pipe(
76
+ map((r) => setEraCache(cacheKey, withActive, mapStakersPaged(era, r)))
77
+ )
78
+ : api.query.staking.erasStakersClipped.entries(era).pipe(
79
+ map((r) => setEraCache(cacheKey, withActive, mapStakersClipped(era, r)))
80
+ );
81
+ });
82
+ }
83
+
84
+ /**
85
+ * @name eraExposure
86
+ * @description Retrieves the staking exposure (nominators and total stake) for a specific era.
87
+ * @param {EraIndex} eras The staking era to query.
88
+ * @example
89
+ * ```javascript
90
+ * const era = api.createType("EraIndex", 1000);
91
+ * const exposure = await api.derive.staking.eraExposure(era);
92
+ * ```
93
+ */
94
+ export const eraExposure = /*#__PURE__*/ singleEra('_eraExposure');
95
+ export const _erasExposure = /*#__PURE__*/ combineEras('_eraExposure');
96
+ /**
97
+ * @name erasExposure
98
+ * @description Retrieves staking exposure details for multiple past eras.
99
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
100
+ * @example
101
+ * ```javascript
102
+ * const exposure = await api.derive.staking.erasExposure(true);
103
+ * ```
104
+ */
105
+ export const erasExposure = /*#__PURE__*/ erasHistoricApply('_erasExposure');
@@ -0,0 +1,47 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { u32 } from '@pezkuwi/types';
6
+ import type { EraIndex } from '@pezkuwi/types/interfaces';
7
+ import type { BN } from '@pezkuwi/util';
8
+ import type { DeriveApi } from '../types.js';
9
+
10
+ import { combineLatest, map, of } from 'rxjs';
11
+
12
+ import { BN_ONE, BN_ZERO } from '@pezkuwi/util';
13
+
14
+ import { memo } from '../util/index.js';
15
+
16
+ /**
17
+ * @name erasHistoric
18
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
19
+ */
20
+ export function erasHistoric (instanceId: string, api: DeriveApi): (withActive?: boolean) => Observable<EraIndex[]> {
21
+ return memo(instanceId, (withActive?: boolean): Observable<EraIndex[]> =>
22
+ combineLatest([
23
+ api.query.staking.activeEra(),
24
+ api.consts.staking.historyDepth
25
+ ? of(api.consts.staking.historyDepth)
26
+ : api.query.staking['historyDepth']<u32>()
27
+ ]).pipe(
28
+ map(([activeEraOpt, historyDepth]): EraIndex[] => {
29
+ const result: EraIndex[] = [];
30
+ const max = historyDepth.toNumber();
31
+ const activeEra: BN = activeEraOpt.unwrapOrDefault().index;
32
+ let lastEra = activeEra;
33
+
34
+ while (lastEra.gte(BN_ZERO) && (result.length < max)) {
35
+ if ((lastEra !== activeEra) || (withActive === true)) {
36
+ result.push(api.registry.createType('EraIndex', lastEra));
37
+ }
38
+
39
+ lastEra = lastEra.sub(BN_ONE);
40
+ }
41
+
42
+ // go from oldest to newest
43
+ return result.reverse();
44
+ })
45
+ )
46
+ );
47
+ }
@@ -0,0 +1,67 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { EraIndex } from '@pezkuwi/types/interfaces';
6
+ import type { PalletStakingEraRewardPoints } from '@pezkuwi/types/lookup';
7
+ import type { DeriveApi, DeriveEraPoints, DeriveEraValPoints } from '../types.js';
8
+
9
+ import { map, of } from 'rxjs';
10
+
11
+ import { BN_ZERO } from '@pezkuwi/util';
12
+
13
+ import { memo } from '../util/index.js';
14
+ import { filterCachedEras, getEraMultiCache, setEraMultiCache } from './cache.js';
15
+ import { erasHistoricApply, filterEras } from './util.js';
16
+
17
+ const CACHE_KEY = 'eraPoints';
18
+
19
+ function mapValidators ({ individual }: PalletStakingEraRewardPoints): DeriveEraValPoints {
20
+ return [...individual.entries()]
21
+ .filter(([, points]) => points.gt(BN_ZERO))
22
+ .reduce((result: DeriveEraValPoints, [validatorId, points]): DeriveEraValPoints => {
23
+ result[validatorId.toString()] = points;
24
+
25
+ return result;
26
+ }, {});
27
+ }
28
+
29
+ function mapPoints (eras: EraIndex[], points: PalletStakingEraRewardPoints[]): DeriveEraPoints[] {
30
+ return eras.map((era, index): DeriveEraPoints => ({
31
+ era,
32
+ eraPoints: points[index].total,
33
+ validators: mapValidators(points[index])
34
+ }));
35
+ }
36
+
37
+ export function _erasPoints (instanceId: string, api: DeriveApi): (eras: EraIndex[], withActive: boolean) => Observable<DeriveEraPoints[]> {
38
+ return memo(instanceId, (eras: EraIndex[], withActive: boolean): Observable<DeriveEraPoints[]> => {
39
+ if (!eras.length) {
40
+ return of([]);
41
+ }
42
+
43
+ const cached = getEraMultiCache<DeriveEraPoints>(CACHE_KEY, eras, withActive);
44
+ const remaining = filterEras(eras, cached);
45
+
46
+ return !remaining.length
47
+ ? of(cached)
48
+ : api.query.staking.erasRewardPoints.multi(remaining).pipe(
49
+ map((p) => filterCachedEras(eras, cached, setEraMultiCache(CACHE_KEY, withActive, mapPoints(remaining, p))))
50
+ );
51
+ });
52
+ }
53
+
54
+ /**
55
+ * @name erasPoints
56
+ * @description Retrieves historical era points with its validators.
57
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
58
+ * @example
59
+ * ```javascript
60
+ * const points = await api.derive.staking.erasPoints(true);
61
+ * console.log(
62
+ * "Validator points:",
63
+ * points.map(({ era, eraPoints }) => `Era: ${era}, points ${eraPoints}`)
64
+ * );
65
+ * ```
66
+ */
67
+ export const erasPoints = /*#__PURE__*/ erasHistoricApply('_erasPoints');
@@ -0,0 +1,63 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { StorageKey } from '@pezkuwi/types';
6
+ import type { EraIndex } from '@pezkuwi/types/interfaces';
7
+ import type { PalletStakingValidatorPrefs } from '@pezkuwi/types/lookup';
8
+ import type { DeriveApi, DeriveEraPrefs, DeriveEraValPrefs } from '../types.js';
9
+
10
+ import { map, of } from 'rxjs';
11
+
12
+ import { memo } from '../util/index.js';
13
+ import { getEraCache, setEraCache } from './cache.js';
14
+ import { combineEras, erasHistoricApply, singleEra } from './util.js';
15
+
16
+ const CACHE_KEY = 'eraPrefs';
17
+
18
+ function mapPrefs (era: EraIndex, all: [StorageKey, PalletStakingValidatorPrefs][]): DeriveEraPrefs {
19
+ const validators: DeriveEraValPrefs = {};
20
+
21
+ all.forEach(([key, prefs]): void => {
22
+ validators[key.args[1].toString()] = prefs;
23
+ });
24
+
25
+ return { era, validators };
26
+ }
27
+
28
+ export function _eraPrefs (instanceId: string, api: DeriveApi): (era: EraIndex, withActive: boolean) => Observable<DeriveEraPrefs> {
29
+ return memo(instanceId, (era: EraIndex, withActive: boolean): Observable<DeriveEraPrefs> => {
30
+ const [cacheKey, cached] = getEraCache<DeriveEraPrefs>(CACHE_KEY, era, withActive);
31
+
32
+ return cached
33
+ ? of(cached)
34
+ : api.query.staking.erasValidatorPrefs.entries(era).pipe(
35
+ map((r) => setEraCache(cacheKey, withActive, mapPrefs(era, r)))
36
+ );
37
+ });
38
+ }
39
+
40
+ /**
41
+ * @name eraPrefs
42
+ * @description Retrieves the validators commission preferences for a given staking era.
43
+ * @param {EraIndex} era The staking era to query.
44
+ * @example
45
+ * ```javascript
46
+ * const era = api.createType("EraIndex", 1000);
47
+ * const prefs = await api.derive.staking.eraPrefs(era);
48
+ * console.log(JSON.stringify(prefs));
49
+ * ```
50
+ */
51
+ export const eraPrefs = /*#__PURE__*/ singleEra('_eraPrefs');
52
+ export const _erasPrefs = /*#__PURE__*/ combineEras('_eraPrefs');
53
+
54
+ /**
55
+ * @name erasPrefs
56
+ * @description Retrieves validators commission preferences for multiple past staking eras
57
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
58
+ * @example
59
+ * ```javascript
60
+ * const prefs = await api.derive.staking.erasPrefs(true);
61
+ * ```
62
+ */
63
+ export const erasPrefs = /*#__PURE__*/ erasHistoricApply('_erasPrefs');
@@ -0,0 +1,52 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { Option } from '@pezkuwi/types';
6
+ import type { Balance, EraIndex } from '@pezkuwi/types/interfaces';
7
+ import type { DeriveApi, DeriveEraRewards } from '../types.js';
8
+
9
+ import { map, of } from 'rxjs';
10
+
11
+ import { memo } from '../util/index.js';
12
+ import { filterCachedEras, getEraMultiCache, setEraMultiCache } from './cache.js';
13
+ import { erasHistoricApply, filterEras } from './util.js';
14
+
15
+ const CACHE_KEY = 'eraRewards';
16
+
17
+ function mapRewards (eras: EraIndex[], optRewards: Option<Balance>[]): DeriveEraRewards[] {
18
+ return eras.map((era, index): DeriveEraRewards => ({
19
+ era,
20
+ eraReward: optRewards[index].unwrapOrDefault()
21
+ }));
22
+ }
23
+
24
+ export function _erasRewards (instanceId: string, api: DeriveApi): (eras: EraIndex[], withActive: boolean) => Observable<DeriveEraRewards[]> {
25
+ return memo(instanceId, (eras: EraIndex[], withActive: boolean): Observable<DeriveEraRewards[]> => {
26
+ if (!eras.length) {
27
+ return of([]);
28
+ }
29
+
30
+ const cached = getEraMultiCache<DeriveEraRewards>(CACHE_KEY, eras, withActive);
31
+ const remaining = filterEras(eras, cached);
32
+
33
+ if (!remaining.length) {
34
+ return of(cached);
35
+ }
36
+
37
+ return api.query.staking.erasValidatorReward.multi(remaining).pipe(
38
+ map((r) => filterCachedEras(eras, cached, setEraMultiCache(CACHE_KEY, withActive, mapRewards(remaining, r))))
39
+ );
40
+ });
41
+ }
42
+
43
+ /**
44
+ * @name erasRewards
45
+ * @description Retrieves rewards for historical eras.
46
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
47
+ * @example
48
+ * ```javascript
49
+ * const rewards = await api.derive.staking.erasRewards(true);
50
+ * ```
51
+ */
52
+ export const erasRewards = /*#__PURE__*/ erasHistoricApply('_erasRewards');
@@ -0,0 +1,69 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { Option, StorageKey } from '@pezkuwi/types';
6
+ import type { BalanceOf, EraIndex, Perbill } from '@pezkuwi/types/interfaces';
7
+ import type { ITuple } from '@pezkuwi/types/types';
8
+ import type { DeriveApi, DeriveEraSlashes, DeriveEraValSlash } from '../types.js';
9
+
10
+ import { combineLatest, map, of } from 'rxjs';
11
+
12
+ import { memo } from '../util/index.js';
13
+ import { getEraCache, setEraCache } from './cache.js';
14
+ import { combineEras, erasHistoricApply, singleEra } from './util.js';
15
+
16
+ const CACHE_KEY = 'eraSlashes';
17
+
18
+ function mapSlashes (era: EraIndex, noms: [StorageKey, Option<BalanceOf>][], vals: [StorageKey, Option<ITuple<[Perbill, BalanceOf]>>][]): DeriveEraSlashes {
19
+ const nominators: DeriveEraValSlash = {};
20
+ const validators: DeriveEraValSlash = {};
21
+
22
+ noms.forEach(([key, optBalance]): void => {
23
+ nominators[key.args[1].toString()] = optBalance.unwrap();
24
+ });
25
+
26
+ vals.forEach(([key, optRes]): void => {
27
+ validators[key.args[1].toString()] = optRes.unwrapOrDefault()[1];
28
+ });
29
+
30
+ return { era, nominators, validators };
31
+ }
32
+
33
+ export function _eraSlashes (instanceId: string, api: DeriveApi): (era: EraIndex, withActive: boolean) => Observable<DeriveEraSlashes> {
34
+ return memo(instanceId, (era: EraIndex, withActive: boolean): Observable<DeriveEraSlashes> => {
35
+ const [cacheKey, cached] = getEraCache<DeriveEraSlashes>(CACHE_KEY, era, withActive);
36
+
37
+ return cached
38
+ ? of(cached)
39
+ : combineLatest([
40
+ api.query.staking.nominatorSlashInEra.entries(era),
41
+ api.query.staking.validatorSlashInEra.entries(era)
42
+ ]).pipe(
43
+ map(([n, v]) => setEraCache(cacheKey, withActive, mapSlashes(era, n, v)))
44
+ );
45
+ });
46
+ }
47
+
48
+ /**
49
+ * @name eraSlashes
50
+ * @description Retrieves the slashes for a specific staking era.
51
+ * @param {EraIndex} eras The staking era to query.
52
+ * @example
53
+ * ```javascript
54
+ * const era = api.createType("EraIndex", 1000);
55
+ * const slashes = await api.derive.staking.eraSlashes(era);
56
+ * ```
57
+ */
58
+ export const eraSlashes = /*#__PURE__*/ singleEra('_eraSlashes');
59
+ export const _erasSlashes = /*#__PURE__*/ combineEras('_eraSlashes');
60
+ /**
61
+ * @name erasSlashes
62
+ * @description Retrieves slashes for historical eras.
63
+ * @param {boolean} withActive? (Optional) Whether to include the active era in the result.
64
+ * @example
65
+ * ```javascript
66
+ * const slashes = await api.derive.staking.erasSlashes(true);
67
+ * ```
68
+ */
69
+ export const erasSlashes = /*#__PURE__*/ erasHistoricApply('_erasSlashes');
@@ -0,0 +1,25 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export * from './account.js';
5
+ export * from './currentPoints.js';
6
+ export * from './electedInfo.js';
7
+ export * from './erasExposure.js';
8
+ export * from './erasHistoric.js';
9
+ export * from './erasPoints.js';
10
+ export * from './erasPrefs.js';
11
+ export * from './erasRewards.js';
12
+ export * from './erasSlashes.js';
13
+ export * from './keys.js';
14
+ export * from './overview.js';
15
+ export * from './ownExposure.js';
16
+ export * from './ownSlashes.js';
17
+ export * from './query.js';
18
+ export * from './stakerExposure.js';
19
+ export * from './stakerPoints.js';
20
+ export * from './stakerPrefs.js';
21
+ export * from './stakerRewards.js';
22
+ export * from './stakerSlashes.js';
23
+ export * from './stashes.js';
24
+ export * from './validators.js';
25
+ export * from './waitingInfo.js';
@@ -0,0 +1,86 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { Option } from '@pezkuwi/types';
6
+ import type { AccountId } from '@pezkuwi/types/interfaces';
7
+ import type { KitchensinkRuntimeSessionKeys } from '@pezkuwi/types/lookup';
8
+ import type { DeriveApi } from '../types.js';
9
+ import type { DeriveStakingKeys } from './types.js';
10
+
11
+ import { combineLatest, map, of, switchMap } from 'rxjs';
12
+
13
+ import { firstMemo, memo } from '../util/index.js';
14
+
15
+ function extractsIds (stashId: Uint8Array | string, queuedKeys: [AccountId, KitchensinkRuntimeSessionKeys | AccountId[]][], nextKeys: Option<KitchensinkRuntimeSessionKeys>): DeriveStakingKeys {
16
+ const sessionIds = (queuedKeys.find(([currentId]) => currentId.eq(stashId)) || [undefined, [] as AccountId[]])[1];
17
+ const nextSessionIds = nextKeys.unwrapOr([] as AccountId[]);
18
+
19
+ return {
20
+ nextSessionIds: Array.isArray(nextSessionIds)
21
+ ? nextSessionIds
22
+ : [...nextSessionIds.values()] as AccountId[],
23
+ sessionIds: Array.isArray(sessionIds)
24
+ ? sessionIds
25
+ : [...sessionIds.values()] as AccountId[]
26
+ };
27
+ }
28
+
29
+ /**
30
+ * @name keys
31
+ * @param { Uint8Array | string } stashId The stash account ID whose session keys are to be retrieved.
32
+ * @description Retrieves the session keys associated with a given stash account.
33
+ * @example
34
+ * ```javascript
35
+ * const keys = await api.derive.staking.keys(
36
+ * ALICE
37
+ * );
38
+ * console.log(
39
+ * "Session keys:",
40
+ * keys.sessionIds.map((key) => `Key: ${key}`)
41
+ * );
42
+ * ```
43
+ */
44
+ export const keys = /*#__PURE__*/ firstMemo(
45
+ (api: DeriveApi, stashId: Uint8Array | string) =>
46
+ api.derive.staking.keysMulti([stashId])
47
+ );
48
+
49
+ /**
50
+ * @name keysMulti
51
+ * @description Retrieves session keys for multiple stash accounts.
52
+ * @param { (Uint8Array | string)[] } stashIds Array of stash account IDs.
53
+ * @example
54
+ * ```javascript
55
+ * const keysMulti = await api.derive.staking.keysMulti([ ALICE, BOB ]);
56
+ * keysMulti.forEach((keys) => {
57
+ * console.log(
58
+ * "Session keys:",
59
+ * keys.sessionIds.map((key) => `Key: ${key}`)
60
+ * );
61
+ * });
62
+ * ```
63
+ */
64
+ export function keysMulti (instanceId: string, api: DeriveApi): (stashIds: (Uint8Array | string)[]) => Observable<DeriveStakingKeys[]> {
65
+ return memo(instanceId, (stashIds: (Uint8Array | string)[]): Observable<DeriveStakingKeys[]> =>
66
+ stashIds.length
67
+ ? api.query.session.queuedKeys().pipe(
68
+ switchMap((queuedKeys) =>
69
+ combineLatest([
70
+ of(queuedKeys),
71
+ // eslint-disable-next-line @typescript-eslint/dot-notation
72
+ api.consts['session']?.['dedupKeyPrefix']
73
+ // eslint-disable-next-line @typescript-eslint/dot-notation
74
+ ? api.query.session.nextKeys.multi(stashIds.map((s) => [api.consts['session']['dedupKeyPrefix'], s]))
75
+ : combineLatest(stashIds.map((s) => api.query.session.nextKeys(s)))
76
+ ])
77
+ ),
78
+ map(([queuedKeys, nextKeys]) =>
79
+ stashIds.map((stashId, index) =>
80
+ extractsIds(stashId, queuedKeys, nextKeys[index])
81
+ )
82
+ )
83
+ )
84
+ : of([])
85
+ );
86
+ }
@@ -0,0 +1,42 @@
1
+ // Copyright 2017-2025 @polkadot/api-derive authors & contributors
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import type { Observable } from 'rxjs';
5
+ import type { DeriveApi, DeriveStakingOverview } from '../types.js';
6
+
7
+ import { combineLatest, map } from 'rxjs';
8
+
9
+ import { objectSpread } from '@pezkuwi/util';
10
+
11
+ import { memo } from '../util/index.js';
12
+
13
+ /**
14
+ * @name overview
15
+ * @description Retrieve the staking overview, including elected validators and points earned.
16
+ * @example
17
+ * ```javascript
18
+ * const {
19
+ * activeEra,
20
+ * activeEraStart,
21
+ * currentEra,
22
+ * currentIndex,
23
+ * nextElected,
24
+ * validatorCount,
25
+ * validators,
26
+ * } = await api.derive.staking.overview();
27
+ * ```
28
+ */
29
+ export function overview (instanceId: string, api: DeriveApi): () => Observable<DeriveStakingOverview> {
30
+ return memo(instanceId, (): Observable<DeriveStakingOverview> =>
31
+ combineLatest([
32
+ api.derive.session.indexes(),
33
+ api.derive.staking.validators()
34
+ ]).pipe(
35
+ map(([indexes, { nextElected, validators }]): DeriveStakingOverview =>
36
+ objectSpread({}, indexes, {
37
+ nextElected,
38
+ validators
39
+ })
40
+ )
41
+ ));
42
+ }