@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.
- package/README.md +30 -0
- package/build/accounts/accountId.d.ts +17 -0
- package/build/accounts/flags.d.ts +29 -0
- package/build/accounts/idAndIndex.d.ts +15 -0
- package/build/accounts/idToIndex.d.ts +16 -0
- package/build/accounts/identity.d.ts +48 -0
- package/build/accounts/index.d.ts +8 -0
- package/build/accounts/indexToId.d.ts +15 -0
- package/build/accounts/indexes.d.ts +16 -0
- package/build/accounts/info.d.ts +18 -0
- package/build/accounts/types.d.ts +39 -0
- package/build/alliance/index.d.ts +70 -0
- package/build/augment.d.ts +1 -0
- package/build/bagsList/get.d.ts +12 -0
- package/build/bagsList/getExpanded.d.ts +16 -0
- package/build/bagsList/index.d.ts +3 -0
- package/build/bagsList/listNodes.d.ts +9 -0
- package/build/bagsList/types.d.ts +13 -0
- package/build/bagsList/util.d.ts +2 -0
- package/build/balances/account.d.ts +17 -0
- package/build/balances/all.d.ts +20 -0
- package/build/balances/index.d.ts +20 -0
- package/build/balances/types.d.ts +69 -0
- package/build/balances/votingBalances.d.ts +15 -0
- package/build/bounties/bounties.d.ts +12 -0
- package/build/bounties/helpers/filterBountyProposals.d.ts +2 -0
- package/build/bounties/index.d.ts +1 -0
- package/build/bundle.d.ts +9 -0
- package/build/chain/bestNumber.d.ts +11 -0
- package/build/chain/bestNumberFinalized.d.ts +12 -0
- package/build/chain/bestNumberLag.d.ts +15 -0
- package/build/chain/getBlock.d.ts +15 -0
- package/build/chain/getBlockByNumber.d.ts +16 -0
- package/build/chain/getHeader.d.ts +16 -0
- package/build/chain/index.d.ts +10 -0
- package/build/chain/subscribeFinalizedBlocks.d.ts +14 -0
- package/build/chain/subscribeFinalizedHeads.d.ts +22 -0
- package/build/chain/subscribeNewBlocks.d.ts +14 -0
- package/build/chain/subscribeNewHeads.d.ts +15 -0
- package/build/chain/util.d.ts +9 -0
- package/build/collective/helpers.d.ts +6 -0
- package/build/collective/index.d.ts +3 -0
- package/build/collective/members.d.ts +2 -0
- package/build/collective/prime.d.ts +2 -0
- package/build/collective/proposals.d.ts +6 -0
- package/build/collective/types.d.ts +19 -0
- package/build/contracts/fees.d.ts +14 -0
- package/build/contracts/index.d.ts +1 -0
- package/build/council/index.d.ts +72 -0
- package/build/council/types.d.ts +6 -0
- package/build/council/votes.d.ts +11 -0
- package/build/council/votesOf.d.ts +16 -0
- package/build/crowdloan/childKey.d.ts +15 -0
- package/build/crowdloan/contributions.d.ts +14 -0
- package/build/crowdloan/index.d.ts +3 -0
- package/build/crowdloan/ownContributions.d.ts +15 -0
- package/build/crowdloan/types.d.ts +6 -0
- package/build/crowdloan/util.d.ts +10 -0
- package/build/democracy/dispatchQueue.d.ts +12 -0
- package/build/democracy/index.d.ts +11 -0
- package/build/democracy/locks.d.ts +14 -0
- package/build/democracy/nextExternal.d.ts +12 -0
- package/build/democracy/preimages.d.ts +24 -0
- package/build/democracy/proposals.d.ts +12 -0
- package/build/democracy/referendumIds.d.ts +12 -0
- package/build/democracy/referendums.d.ts +11 -0
- package/build/democracy/referendumsActive.d.ts +12 -0
- package/build/democracy/referendumsFinished.d.ts +15 -0
- package/build/democracy/referendumsInfo.d.ts +23 -0
- package/build/democracy/sqrtElectorate.d.ts +13 -0
- package/build/democracy/types.d.ts +70 -0
- package/build/democracy/util.d.ts +18 -0
- package/build/derive.d.ts +52 -0
- package/build/elections/index.d.ts +1 -0
- package/build/elections/info.d.ts +14 -0
- package/build/elections/types.d.ts +18 -0
- package/build/imOnline/index.d.ts +1 -0
- package/build/imOnline/receivedHeartbeats.d.ts +13 -0
- package/build/index.d.ts +2 -0
- package/build/membership/index.d.ts +70 -0
- package/build/packageDetect.d.ts +1 -0
- package/build/packageInfo.d.ts +6 -0
- package/build/parachains/index.d.ts +2 -0
- package/build/parachains/info.d.ts +19 -0
- package/build/parachains/overview.d.ts +15 -0
- package/build/parachains/types.d.ts +38 -0
- package/build/parachains/util.d.ts +3 -0
- package/build/session/index.d.ts +3 -0
- package/build/session/indexes.d.ts +15 -0
- package/build/session/info.d.ts +13 -0
- package/build/session/progress.d.ts +47 -0
- package/build/session/types.d.ts +19 -0
- package/build/society/candidates.d.ts +12 -0
- package/build/society/index.d.ts +4 -0
- package/build/society/info.d.ts +12 -0
- package/build/society/member.d.ts +14 -0
- package/build/society/members.d.ts +14 -0
- package/build/society/types.d.ts +27 -0
- package/build/staking/account.d.ts +31 -0
- package/build/staking/cache.d.ts +12 -0
- package/build/staking/currentPoints.d.ts +13 -0
- package/build/staking/electedInfo.d.ts +23 -0
- package/build/staking/erasExposure.d.ts +30 -0
- package/build/staking/erasHistoric.d.ts +8 -0
- package/build/staking/erasPoints.d.ts +18 -0
- package/build/staking/erasPrefs.d.ts +27 -0
- package/build/staking/erasRewards.d.ts +14 -0
- package/build/staking/erasSlashes.d.ts +26 -0
- package/build/staking/index.d.ts +22 -0
- package/build/staking/keys.d.ts +35 -0
- package/build/staking/overview.d.ts +19 -0
- package/build/staking/ownExposure.d.ts +37 -0
- package/build/staking/ownSlashes.d.ts +35 -0
- package/build/staking/query.d.ts +31 -0
- package/build/staking/stakerExposure.d.ts +33 -0
- package/build/staking/stakerPoints.d.ts +22 -0
- package/build/staking/stakerPrefs.d.ts +24 -0
- package/build/staking/stakerRewards.d.ts +49 -0
- package/build/staking/stakerSlashes.d.ts +22 -0
- package/build/staking/stashes.d.ts +16 -0
- package/build/staking/types.d.ts +139 -0
- package/build/staking/util.d.ts +14 -0
- package/build/staking/validators.d.ts +33 -0
- package/build/staking/waitingInfo.d.ts +16 -0
- package/build/technicalCommittee/index.d.ts +70 -0
- package/build/treasury/index.d.ts +1 -0
- package/build/treasury/proposals.d.ts +12 -0
- package/build/tx/constants.d.ts +5 -0
- package/build/tx/events.d.ts +22 -0
- package/build/tx/extrinsicInfo.d.ts +61 -0
- package/build/tx/index.d.ts +3 -0
- package/build/tx/signingInfo.d.ts +25 -0
- package/build/type/HeaderExtended.d.ts +4 -0
- package/build/type/SignedBlockExtended.d.ts +4 -0
- package/build/type/index.d.ts +2 -0
- package/build/type/types.d.ts +15 -0
- package/build/type/util.d.ts +2 -0
- package/build/types.d.ts +79 -0
- package/build/util/approvalFlagsToBools.d.ts +4 -0
- package/build/util/blockNumber.d.ts +7 -0
- package/build/util/cache.d.ts +4 -0
- package/build/util/cacheImpl.d.ts +3 -0
- package/build/util/first.d.ts +4 -0
- package/build/util/index.d.ts +7 -0
- package/build/util/lazy.d.ts +4 -0
- package/build/util/types.d.ts +6 -0
- package/package.json +42 -0
- package/src/accounts/accountId.ts +44 -0
- package/src/accounts/flags.ts +90 -0
- package/src/accounts/idAndIndex.ts +51 -0
- package/src/accounts/idToIndex.ts +31 -0
- package/src/accounts/identity.ts +235 -0
- package/src/accounts/index.ts +11 -0
- package/src/accounts/indexToId.ts +33 -0
- package/src/accounts/indexes.ts +56 -0
- package/src/accounts/info.ts +58 -0
- package/src/accounts/types.ts +48 -0
- package/src/alliance/index.ts +76 -0
- package/src/augment.ts +4 -0
- package/src/bagsList/get.ts +79 -0
- package/src/bagsList/getExpanded.ts +41 -0
- package/src/bagsList/index.ts +6 -0
- package/src/bagsList/listNodes.ts +50 -0
- package/src/bagsList/types.ts +18 -0
- package/src/bagsList/util.ts +14 -0
- package/src/balances/account.ts +210 -0
- package/src/balances/all.ts +246 -0
- package/src/balances/index.ts +26 -0
- package/src/balances/types.ts +79 -0
- package/src/balances/votingBalances.ts +33 -0
- package/src/bounties/bounties.spec.ts +162 -0
- package/src/bounties/bounties.ts +76 -0
- package/src/bounties/helpers/filterBountyProposals.ts +13 -0
- package/src/bounties/index.ts +4 -0
- package/src/bundle.ts +140 -0
- package/src/chain/bestNumber.ts +21 -0
- package/src/chain/bestNumberFinalized.ts +22 -0
- package/src/chain/bestNumberLag.ts +33 -0
- package/src/chain/getBlock.ts +43 -0
- package/src/chain/getBlockByNumber.ts +30 -0
- package/src/chain/getHeader.ts +37 -0
- package/src/chain/index.ts +13 -0
- package/src/chain/subscribeFinalizedBlocks.ts +30 -0
- package/src/chain/subscribeFinalizedHeads.ts +62 -0
- package/src/chain/subscribeNewBlocks.ts +30 -0
- package/src/chain/subscribeNewHeads.ts +38 -0
- package/src/chain/util.ts +112 -0
- package/src/checkTypes.manual.ts +8 -0
- package/src/collective/helpers.ts +36 -0
- package/src/collective/index.ts +6 -0
- package/src/collective/members.ts +8 -0
- package/src/collective/prime.ts +25 -0
- package/src/collective/proposals.ts +73 -0
- package/src/collective/types.ts +30 -0
- package/src/contracts/fees.ts +61 -0
- package/src/contracts/index.ts +4 -0
- package/src/council/index.ts +79 -0
- package/src/council/types.ts +11 -0
- package/src/council/votes.ts +97 -0
- package/src/council/votesOf.ts +35 -0
- package/src/crowdloan/childKey.ts +57 -0
- package/src/crowdloan/contributions.ts +142 -0
- package/src/crowdloan/index.ts +6 -0
- package/src/crowdloan/ownContributions.ts +81 -0
- package/src/crowdloan/types.ts +11 -0
- package/src/crowdloan/util.ts +33 -0
- package/src/democracy/dispatchQueue.ts +158 -0
- package/src/democracy/index.ts +14 -0
- package/src/democracy/locks.ts +114 -0
- package/src/democracy/nextExternal.ts +49 -0
- package/src/democracy/preimages.ts +171 -0
- package/src/democracy/proposals.ts +81 -0
- package/src/democracy/referendumIds.ts +37 -0
- package/src/democracy/referendums.ts +39 -0
- package/src/democracy/referendumsActive.ts +30 -0
- package/src/democracy/referendumsFinished.ts +37 -0
- package/src/democracy/referendumsInfo.ts +181 -0
- package/src/democracy/sqrtElectorate.ts +29 -0
- package/src/democracy/types.ts +84 -0
- package/src/democracy/util.ts +166 -0
- package/src/derive.ts +41 -0
- package/src/elections/index.ts +4 -0
- package/src/elections/info.ts +126 -0
- package/src/elections/types.ts +22 -0
- package/src/imOnline/index.ts +4 -0
- package/src/imOnline/receivedHeartbeats.ts +65 -0
- package/src/index.spec.ts +103 -0
- package/src/index.ts +6 -0
- package/src/membership/index.ts +76 -0
- package/src/mod.ts +4 -0
- package/src/packageDetect.ts +11 -0
- package/src/packageInfo.ts +6 -0
- package/src/parachains/index.ts +5 -0
- package/src/parachains/info.ts +111 -0
- package/src/parachains/overview.ts +63 -0
- package/src/parachains/types.ts +46 -0
- package/src/parachains/util.ts +11 -0
- package/src/session/index.ts +6 -0
- package/src/session/indexes.ts +90 -0
- package/src/session/info.ts +39 -0
- package/src/session/progress.ts +130 -0
- package/src/session/types.ts +25 -0
- package/src/society/candidates.ts +71 -0
- package/src/society/index.ts +7 -0
- package/src/society/info.ts +50 -0
- package/src/society/member.ts +28 -0
- package/src/society/members.ts +107 -0
- package/src/society/types.ts +33 -0
- package/src/staking/account.ts +112 -0
- package/src/staking/cache.ts +48 -0
- package/src/staking/currentPoints.ts +28 -0
- package/src/staking/electedInfo.ts +54 -0
- package/src/staking/erasExposure.ts +105 -0
- package/src/staking/erasHistoric.ts +47 -0
- package/src/staking/erasPoints.ts +67 -0
- package/src/staking/erasPrefs.ts +63 -0
- package/src/staking/erasRewards.ts +52 -0
- package/src/staking/erasSlashes.ts +69 -0
- package/src/staking/index.ts +25 -0
- package/src/staking/keys.ts +86 -0
- package/src/staking/overview.ts +42 -0
- package/src/staking/ownExposure.ts +83 -0
- package/src/staking/ownSlashes.ts +68 -0
- package/src/staking/query.ts +230 -0
- package/src/staking/stakerExposure.ts +78 -0
- package/src/staking/stakerPoints.ts +46 -0
- package/src/staking/stakerPrefs.ts +45 -0
- package/src/staking/stakerRewards.ts +298 -0
- package/src/staking/stakerSlashes.ts +45 -0
- package/src/staking/stashes.ts +55 -0
- package/src/staking/types.ts +174 -0
- package/src/staking/util.ts +94 -0
- package/src/staking/validators.ts +82 -0
- package/src/staking/waitingInfo.ts +45 -0
- package/src/technicalCommittee/index.ts +76 -0
- package/src/test/bountyFactory.ts +39 -0
- package/src/test/bytesFactory.ts +15 -0
- package/src/test/helpers.ts +23 -0
- package/src/test/proposalFactory.ts +25 -0
- package/src/treasury/index.ts +4 -0
- package/src/treasury/proposals.ts +109 -0
- package/src/tx/constants.ts +13 -0
- package/src/tx/events.ts +43 -0
- package/src/tx/extrinsicInfo.ts +123 -0
- package/src/tx/index.ts +6 -0
- package/src/tx/signingInfo.ts +129 -0
- package/src/type/HeaderExtended.ts +33 -0
- package/src/type/SignedBlockExtended.ts +75 -0
- package/src/type/index.ts +5 -0
- package/src/type/types.ts +21 -0
- package/src/type/util.ts +45 -0
- package/src/types.ts +97 -0
- package/src/util/approvalFlagToBools.spec.ts +37 -0
- package/src/util/approvalFlagsToBools.ts +26 -0
- package/src/util/blockNumber.ts +15 -0
- package/src/util/cache.ts +65 -0
- package/src/util/cacheImpl.ts +30 -0
- package/src/util/first.ts +20 -0
- package/src/util/index.ts +13 -0
- package/src/util/lazy.ts +16 -0
- package/src/util/types.ts +9 -0
- package/tsconfig.build.json +21 -0
- package/tsconfig.build.tsbuildinfo +1 -0
- 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
|
+
}
|