From 6fa02f9d394930d6f339d46dfc227fc0c70795ad Mon Sep 17 00:00:00 2001 From: Ross Bulat Date: Tue, 30 Apr 2024 18:46:19 +0700 Subject: [PATCH] feat(refactor): Remove pre-paged rewards code (part 1) (#2101) --- src/contexts/Payouts/index.tsx | 106 ++++++++---------------------- src/modals/ClaimPayouts/Forms.tsx | 15 ++--- src/model/Api/index.ts | 15 +---- 3 files changed, 33 insertions(+), 103 deletions(-) diff --git a/src/contexts/Payouts/index.tsx b/src/contexts/Payouts/index.tsx index 9c9e856920..a9d0635e13 100644 --- a/src/contexts/Payouts/index.tsx +++ b/src/contexts/Payouts/index.tsx @@ -11,7 +11,6 @@ import { rmCommas, setStateWithRef } from '@w3ux/utils'; import BigNumber from 'bignumber.js'; import { useNetwork } from 'contexts/Network'; import { useActiveAccounts } from 'contexts/ActiveAccounts'; -import { NetworksWithPagedRewards } from 'config/networks'; import { MaxSupportedPayoutEras, defaultPayoutsContext } from './defaults'; import type { LocalValidatorExposure, @@ -35,9 +34,9 @@ export const usePayouts = () => useContext(PayoutsContext); export const PayoutsProvider = ({ children }: { children: ReactNode }) => { const { network } = useNetwork(); + const { api, consts, activeEra } = useApi(); const { activeAccount } = useActiveAccounts(); const { isNominating, fetchEraStakers } = useStaking(); - const { api, consts, activeEra, isPagedRewardsActive } = useApi(); const { maxExposurePageSize } = consts; // Store active accont's payout state. @@ -162,21 +161,6 @@ export const PayoutsProvider = ({ children }: { children: ReactNode }) => { new BigNumber(b).minus(a).toNumber() ); - // Helper function to check which eras a validator was exposed in. - const validatorExposedEras = (validator: string) => { - const exposedEras: string[] = []; - for (const era of erasToCheck) { - if ( - Object.values( - Object.keys(getLocalEraExposure(network, era, activeAccount)) - )?.[0] === validator - ) { - exposedEras.push(era); - } - } - return exposedEras; - }; - // Fetch controllers in order to query ledgers. const bondedResults = await api.query.staking.bonded.multi(uniqueValidators); @@ -193,70 +177,34 @@ export const PayoutsProvider = ({ children }: { children: ReactNode }) => { // Refer to new `ClaimedRewards` storage item and calculate unclaimed rewards from that and // `exposedPage` stored locally in exposure data. - if (isPagedRewardsActive(activeEra.index)) { - // Accumulate calls to fetch unclaimed rewards for each era for all validators. - const unclaimedRewardsEntries = erasToCheck - .map((era) => uniqueValidators.map((v) => [era, v])) - .flat(); - - const results = await Promise.all( - unclaimedRewardsEntries.map(([era, v]) => - api.query.staking.claimedRewards(era, v) - ) - ); - for (let i = 0; i < results.length; i++) { - const pages = results[i].toHuman() || []; - const era = unclaimedRewardsEntries[i][0]; - const validator = unclaimedRewardsEntries[i][1]; - const exposure = getLocalEraExposure(network, era, activeAccount); - const exposedPage = - exposure?.[validator]?.exposedPage !== undefined - ? String(exposure[validator].exposedPage) - : undefined; - - // Add to `unclaimedRewards` if payout page has not yet been claimed. - if (!pages.includes(exposedPage)) { - if (unclaimedRewards?.[validator]) { - unclaimedRewards[validator].push(era); - } else { - unclaimedRewards[validator] = [era]; - } - } - } - } else { - // DEPRECATION: Paged Rewards - // - // Use `staking.ledger` to get unclaimed reward eras. Read `legacyClaimedRewards` - // if paged rewards are active, otherwise use `claimedRewards`. - const ledgerResults = await api.query.staking.ledger.multi( - Object.values(validatorControllers) - ); + // Accumulate calls to fetch unclaimed rewards for each era for all validators. + const unclaimedRewardsEntries = erasToCheck + .map((era) => uniqueValidators.map((v) => [era, v])) + .flat(); + + const results = await Promise.all( + unclaimedRewardsEntries.map(([era, v]) => + api.query.staking.claimedRewards(era, v) + ) + ); - // Fetch ledgers to determine which eras have not yet been claimed per validator. Only - // includes eras that are in `erasToCheck`. - for (const ledgerResult of ledgerResults) { - const ledger = ledgerResult.unwrapOr(null)?.toHuman(); - if (ledger) { - // get claimed eras within `erasToCheck`. - const erasClaimed = ledger[ - NetworksWithPagedRewards.includes(network) - ? 'legacyClaimedRewards' - : 'claimedRewards' - ] - .map((e: string) => rmCommas(e)) - .filter( - (e: string) => - new BigNumber(e).isLessThanOrEqualTo(startEra) && - new BigNumber(e).isGreaterThanOrEqualTo(endEra) - ); - - // filter eras yet to be claimed - unclaimedRewards[ledger.stash] = erasToCheck.filter( - (era) => - validatorExposedEras(ledger.stash).includes(era) && - !erasClaimed.includes(era) - ); + for (let i = 0; i < results.length; i++) { + const pages = results[i].toHuman() || []; + const era = unclaimedRewardsEntries[i][0]; + const validator = unclaimedRewardsEntries[i][1]; + const exposure = getLocalEraExposure(network, era, activeAccount); + const exposedPage = + exposure?.[validator]?.exposedPage !== undefined + ? String(exposure[validator].exposedPage) + : undefined; + + // Add to `unclaimedRewards` if payout page has not yet been claimed. + if (!pages.includes(exposedPage)) { + if (unclaimedRewards?.[validator]) { + unclaimedRewards[validator].push(era); + } else { + unclaimedRewards[validator] = [era]; } } } diff --git a/src/modals/ClaimPayouts/Forms.tsx b/src/modals/ClaimPayouts/Forms.tsx index 4e421a634d..a5e64ea97d 100644 --- a/src/modals/ClaimPayouts/Forms.tsx +++ b/src/modals/ClaimPayouts/Forms.tsx @@ -32,7 +32,7 @@ export const Forms = forwardRef( ref: ForwardedRef ) => { const { t } = useTranslation('modals'); - const { api, isPagedRewardsActive } = useApi(); + const { api } = useApi(); const { networkData: { units, unit }, } = useNetwork(); @@ -68,16 +68,9 @@ export const Forms = forwardRef( if (!paginatedValidators) { return []; } - - return paginatedValidators.forEach(([page, v]) => { - if (isPagedRewardsActive(new BigNumber(era))) { - return calls.push(api.tx.staking.payoutStakersByPage(v, era, page)); - } - // DEPRECATION: Paged Rewards - // - // Fall back to deprecated `payoutStakers` if not on paged reward era. - return calls.push(api.tx.staking.payoutStakers(v, era)); - }); + return paginatedValidators.forEach(([page, v]) => + calls.push(api.tx.staking.payoutStakersByPage(v, era, page)) + ); }); return calls; }; diff --git a/src/model/Api/index.ts b/src/model/Api/index.ts index 9092463ff6..22f091551f 100644 --- a/src/model/Api/index.ts +++ b/src/model/Api/index.ts @@ -15,7 +15,7 @@ import type { } from 'contexts/Api/types'; import { SyncController } from 'controllers/SyncController'; import type { AnyApi, NetworkName } from 'types'; -import { NetworkList, NetworksWithPagedRewards } from 'config/networks'; +import { NetworkList } from 'config/networks'; import { makeCancelable, rmCommas, stringToBigNumber } from '@w3ux/utils'; import { WellKnownChain } from '@substrate/connect'; import type { BlockNumber } from '@polkadot/types/interfaces'; @@ -245,20 +245,9 @@ export class Api { this.api.consts.staking.historyDepth, this.api.consts.fastUnstake.deposit, this.api.consts.nominationPools.palletId, + this.api.consts.staking.maxExposurePageSize, ]; - // DEPRECATION: Paged Rewards - // - // Fetch `maxExposurePageSize` instead of `maxNominatorRewardedPerValidator` for networks that - // have paged rewards. - if (NetworksWithPagedRewards.includes(this.network)) { - allPromises.push(this.api.consts.staking.maxExposurePageSize); - } else { - allPromises.push( - this.api.consts.staking.maxNominatorRewardedPerValidator - ); - } - const consts = await Promise.all(allPromises); // Fetch the active era. Needed for previous era and for queries below.