├── .github ├── dependabot.yml └── workflows │ ├── ci.yml │ └── gh-pages.yml ├── .gitignore ├── .licenserc.json ├── .nvmrc ├── .prettierignore ├── .release-please-manifest.json ├── LICENSE ├── README.md ├── check-markdown-links-config.json ├── docs ├── EN.md ├── ES.md └── ZH.md ├── env.d.ts ├── eslint.config.js ├── package.json ├── packages ├── app │ ├── .env │ ├── .shell │ │ └── build-container.sh │ ├── CHANGELOG.md │ ├── index.html │ ├── package.json │ ├── public │ │ ├── _redirects │ │ ├── favicons │ │ │ ├── apple-touch-icon.png │ │ │ ├── favicon-96x96.png │ │ │ ├── favicon.ico │ │ │ ├── favicon.svg │ │ │ ├── web-app-manifest-192x192.png │ │ │ └── web-app-manifest-512x512.png │ │ ├── fonts │ │ │ ├── Inter.ttf │ │ │ └── Unbounded.ttf │ │ ├── img │ │ │ ├── og-image.png │ │ │ └── wc-icon.png │ │ ├── lottie │ │ │ ├── analytics-dark.lottie │ │ │ ├── analytics-light.lottie │ │ │ ├── globe-dark.lottie │ │ │ ├── globe-light.lottie │ │ │ ├── groups-dark.lottie │ │ │ ├── groups-light.lottie │ │ │ ├── label-dark.lottie │ │ │ ├── label-light.lottie │ │ │ ├── refresh-dark.lottie │ │ │ ├── refresh-light.lottie │ │ │ ├── trending-dark.lottie │ │ │ ├── trending-light.lottie │ │ │ ├── view-dark.lottie │ │ │ └── view-light.lottie │ │ ├── robots.txt │ │ └── site.webmanifest │ ├── src │ │ ├── App.tsx │ │ ├── Offline.tsx │ │ ├── Providers.tsx │ │ ├── Router.tsx │ │ ├── StakingApi │ │ │ ├── FastUnstakeApi.tsx │ │ │ ├── UnclaimedRewardsApi.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── Themes.tsx │ │ ├── common-types.ts │ │ ├── config │ │ │ ├── help.ts │ │ │ ├── pages.ts │ │ │ ├── tips.ts │ │ │ ├── util.ts │ │ │ └── validators │ │ │ │ ├── Amforc.tsx │ │ │ │ ├── ApertureMining.tsx │ │ │ │ ├── Blockseeker.tsx │ │ │ │ ├── Blockshard.tsx │ │ │ │ ├── CoinbaseCloud.tsx │ │ │ │ ├── Crifferent.tsx │ │ │ │ ├── Decentradot.tsx │ │ │ │ ├── Deigenvektor.tsx │ │ │ │ ├── Dionysus.tsx │ │ │ │ ├── Dozenodes.tsx │ │ │ │ ├── DragonStake.tsx │ │ │ │ ├── Frog.tsx │ │ │ │ ├── Gatotech.tsx │ │ │ │ ├── Gdot.tsx │ │ │ │ ├── GenericChain.tsx │ │ │ │ ├── GoOpen.tsx │ │ │ │ ├── GuruStaking.tsx │ │ │ │ ├── Helikon.tsx │ │ │ │ ├── Helixstreet.tsx │ │ │ │ ├── Highstake.tsx │ │ │ │ ├── HoneyStake.tsx │ │ │ │ ├── Metaspan.tsx │ │ │ │ ├── P2POrg.tsx │ │ │ │ ├── PDP.tsx │ │ │ │ ├── Paranodes.tsx │ │ │ │ ├── PioneerStake.tsx │ │ │ │ ├── Polkachu.tsx │ │ │ │ ├── Polkadotters.tsx │ │ │ │ ├── ProStakers.tsx │ │ │ │ ├── PythagorasCapitalInvestment.tsx │ │ │ │ ├── Saxemberg.tsx │ │ │ │ ├── SekoyaLabs.tsx │ │ │ │ ├── StakeMagnet.tsx │ │ │ │ ├── StakeWorld.tsx │ │ │ │ ├── Stakely.tsx │ │ │ │ ├── Stakenode.tsx │ │ │ │ ├── Stakepile.tsx │ │ │ │ ├── Stakeplus.tsx │ │ │ │ ├── StakerSpace.tsx │ │ │ │ ├── Stakin.tsx │ │ │ │ ├── Staking4All.tsx │ │ │ │ ├── StakingFacilities.tsx │ │ │ │ ├── TurboFlakes.tsx │ │ │ │ ├── VFValidierung.tsx │ │ │ │ ├── Wojdot.tsx │ │ │ │ ├── bLdNodes.tsx │ │ │ │ └── index.ts │ │ ├── contexts │ │ │ ├── ActiveAccounts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Api │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Balances │ │ │ │ ├── Utils.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Connect │ │ │ │ ├── ExternalAccounts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── ImportedAccounts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── OtherAccounts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ └── Utils.ts │ │ │ ├── Currency │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── FastUnstake │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Filters │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Help │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Invites │ │ │ │ ├── index.tsx │ │ │ │ ├── local.ts │ │ │ │ ├── types.ts │ │ │ │ └── util.ts │ │ │ ├── LedgerHardware │ │ │ │ ├── Utils.tsx │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── static │ │ │ │ │ └── ledger.ts │ │ │ │ └── types.ts │ │ │ ├── List │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ManageNominations │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Menu │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Migrate │ │ │ │ └── index.tsx │ │ │ ├── Network │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── NominatorSetups │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── local.ts │ │ │ │ └── types.ts │ │ │ ├── Operators │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Payouts │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Plugins │ │ │ │ ├── Utils.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── PoolSetups │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ ├── local.ts │ │ │ │ └── types.ts │ │ │ ├── Pools │ │ │ │ ├── ActivePool │ │ │ │ │ ├── defaults.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── BondedPools │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── FavoritePools │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── PoolMembers │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ └── util.ts │ │ │ ├── Prompt │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Proxies │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Staking │ │ │ │ ├── Utils.ts │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ThemeValues │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Themes │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── TokenPrice │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Tooltip │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── TransferOptions │ │ │ │ ├── Utils.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── TxMeta │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── UI │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Validators │ │ │ │ ├── FavoriteValidators │ │ │ │ │ └── index.tsx │ │ │ │ ├── Utils.ts │ │ │ │ ├── ValidatorEntries │ │ │ │ │ ├── defaults.ts │ │ │ │ │ └── index.tsx │ │ │ │ └── types.ts │ │ │ └── WalletConnect │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ ├── controllers │ │ │ ├── Notifications │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── OnlineStatus │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── PolkaWatch │ │ │ │ └── index.ts │ │ │ ├── Subscan │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── TxSubmission │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ └── utils.ts │ │ ├── hooks │ │ │ ├── useAccountFromUrl │ │ │ │ └── index.tsx │ │ │ ├── useAverageRewardRate │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── useBatchCall │ │ │ │ └── index.tsx │ │ │ ├── useBondGreatestFee │ │ │ │ └── index.tsx │ │ │ ├── useCreatePoolAccounts │ │ │ │ └── index.tsx │ │ │ ├── useDotLottieButton │ │ │ │ └── index.tsx │ │ │ ├── useEraTimeLeft │ │ │ │ └── index.tsx │ │ │ ├── useErasPerDay │ │ │ │ └── index.tsx │ │ │ ├── useErasToTimeLeft │ │ │ │ └── index.tsx │ │ │ ├── useFetchMethods │ │ │ │ └── index.tsx │ │ │ ├── useFillVariables │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── useInjectBlockTimestamp │ │ │ │ └── index.tsx │ │ │ ├── useNominationStatus │ │ │ │ └── index.tsx │ │ │ ├── usePayeeConfig │ │ │ │ └── index.tsx │ │ │ ├── usePoolCommission │ │ │ │ └── index.tsx │ │ │ ├── usePoolFilters │ │ │ │ └── index.tsx │ │ │ ├── useProxySupported │ │ │ │ └── index.tsx │ │ │ ├── useSignerAvailable │ │ │ │ └── index.tsx │ │ │ ├── useSignerWarnings │ │ │ │ └── index.tsx │ │ │ ├── useSubmitExtrinsic │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── useSyncing │ │ │ │ └── index.tsx │ │ │ ├── useUnstaking │ │ │ │ └── index.tsx │ │ │ └── useValidatorFilters │ │ │ │ └── index.tsx │ │ ├── library │ │ │ ├── Account │ │ │ │ ├── DefaultAccount.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ └── types.ts │ │ │ ├── AccountInput │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ActionItem │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Announcements │ │ │ │ ├── Header.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── types.ts │ │ │ ├── Balance │ │ │ │ ├── Value │ │ │ │ │ └── index.tsx │ │ │ │ ├── WithFiat │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── BarChart │ │ │ │ ├── BarSegment.tsx │ │ │ │ ├── BondedChart.tsx │ │ │ │ ├── LegendItem.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── defaults.ts │ │ │ │ └── types.ts │ │ │ ├── ButtonCopy │ │ │ │ └── index.tsx │ │ │ ├── CallToAction │ │ │ │ └── index.tsx │ │ │ ├── Card │ │ │ │ └── Wrappers.ts │ │ │ ├── Countdown │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ErrorBoundary │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ ├── EstimatedTxFee │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Filter │ │ │ │ ├── Container.tsx │ │ │ │ ├── Item.tsx │ │ │ │ ├── LargeItem.tsx │ │ │ │ ├── Tabs.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── defaults.ts │ │ │ │ └── types.ts │ │ │ ├── Form │ │ │ │ ├── Bond │ │ │ │ │ ├── BondFeedback.tsx │ │ │ │ │ └── BondInput.tsx │ │ │ │ ├── ClaimPermissionInput │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── CreatePoolStatusBar │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── MinDelayInput │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── NominateStatusBar │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Unbond │ │ │ │ │ ├── UnbondFeedback.tsx │ │ │ │ │ └── UnbondInput.tsx │ │ │ │ ├── Warning │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── types.ts │ │ │ ├── GenerateNominations │ │ │ │ ├── Controls │ │ │ │ │ ├── InlineControls.tsx │ │ │ │ │ ├── ListControls.tsx │ │ │ │ │ ├── MenuControls.tsx │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ └── types.ts │ │ │ │ ├── Methods.tsx │ │ │ │ ├── Prompts │ │ │ │ │ ├── RevertChanges.tsx │ │ │ │ │ ├── SearchValidators.tsx │ │ │ │ │ └── SelectFavorites.tsx │ │ │ │ ├── Revert.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Graphs │ │ │ │ ├── AveragePayoutLine.tsx │ │ │ │ ├── EraPointsLine.tsx │ │ │ │ ├── GeoDonut.tsx │ │ │ │ ├── PayoutBar.tsx │ │ │ │ ├── PayoutLine.tsx │ │ │ │ ├── Utils.ts │ │ │ │ ├── Wrapper.ts │ │ │ │ └── types.ts │ │ │ ├── Headers │ │ │ │ ├── Account.tsx │ │ │ │ ├── Invite.tsx │ │ │ │ ├── Popovers │ │ │ │ │ ├── AccountPopover │ │ │ │ │ │ ├── Account.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ConnectPopover │ │ │ │ │ │ ├── Extension.tsx │ │ │ │ │ │ ├── Hardware.tsx │ │ │ │ │ │ ├── Proxies.tsx │ │ │ │ │ │ ├── ReadOnly.tsx │ │ │ │ │ │ ├── Utils.ts │ │ │ │ │ │ ├── Wallets.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── MenuPopover.tsx │ │ │ │ │ ├── NotificationsPopover │ │ │ │ │ │ ├── Pool.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Settings.tsx │ │ │ │ ├── SideMenuToggle.tsx │ │ │ │ ├── Sync.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── Help │ │ │ │ ├── Items │ │ │ │ │ ├── ActiveDefinition.tsx │ │ │ │ │ ├── Definition.tsx │ │ │ │ │ ├── External.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── List │ │ │ │ ├── EraPointsGraph │ │ │ │ │ ├── CurrentEraPoints.tsx │ │ │ │ │ ├── HistoricalEraPoints.tsx │ │ │ │ │ └── Inner.tsx │ │ │ │ ├── MotionContainer.tsx │ │ │ │ ├── Pagination.tsx │ │ │ │ ├── SearchInput.tsx │ │ │ │ ├── Utils.tsx │ │ │ │ ├── index.ts │ │ │ │ └── types.ts │ │ │ ├── ListItem │ │ │ │ ├── Buttons │ │ │ │ │ ├── CopyAddress.tsx │ │ │ │ │ ├── FavoritePool.tsx │ │ │ │ │ ├── FavoriteValidator.tsx │ │ │ │ │ ├── Metrics.tsx │ │ │ │ │ ├── More.tsx │ │ │ │ │ ├── Remove.tsx │ │ │ │ │ └── Select.tsx │ │ │ │ ├── Labels │ │ │ │ │ ├── Blocked.tsx │ │ │ │ │ ├── Commission.tsx │ │ │ │ │ ├── EraStatus.tsx │ │ │ │ │ ├── Identity.tsx │ │ │ │ │ ├── Members.tsx │ │ │ │ │ ├── NominationStatus.tsx │ │ │ │ │ ├── PoolBonded.tsx │ │ │ │ │ ├── PoolCommission.tsx │ │ │ │ │ ├── PoolId.tsx │ │ │ │ │ ├── PoolIdentity.tsx │ │ │ │ │ ├── PoolMemberBonded.tsx │ │ │ │ │ ├── PoolNominateStatus.tsx │ │ │ │ │ ├── Quartile.tsx │ │ │ │ │ └── RewardShare.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── types.ts │ │ │ ├── Loader │ │ │ │ ├── Announcement.tsx │ │ │ │ ├── CallToAction.tsx │ │ │ │ └── Wrappers.ts │ │ │ ├── MainFooter │ │ │ │ ├── Status.tsx │ │ │ │ ├── TokenPrice.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── Menu │ │ │ │ ├── List.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── Modal │ │ │ │ ├── Title.tsx │ │ │ │ └── Wrappers.ts │ │ │ ├── NominationList │ │ │ │ ├── Item.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Nominations │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── NotificationPrompts │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ ├── PageTabs │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── PageWithTitle │ │ │ │ └── index.tsx │ │ │ ├── PayeeInput │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Pool │ │ │ │ ├── Rewards.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── PoolList │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Prompt │ │ │ │ ├── Confirm.tsx │ │ │ │ ├── Title.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── QRCode │ │ │ │ ├── Display.tsx │ │ │ │ ├── DisplayPayload.tsx │ │ │ │ ├── Scan.tsx │ │ │ │ ├── ScanSignature.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── qrcode.ts │ │ │ │ ├── types.ts │ │ │ │ └── util.ts │ │ │ ├── QrReader │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── SelectItems │ │ │ │ ├── Item.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── SetupSteps │ │ │ │ ├── Footer │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Header │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── MotionContainer.tsx │ │ │ │ ├── Nominate.tsx │ │ │ │ └── types.ts │ │ │ ├── SideMenu │ │ │ │ ├── Advanced.tsx │ │ │ │ ├── Heading │ │ │ │ │ ├── Heading.tsx │ │ │ │ │ └── Wrapper.ts │ │ │ │ ├── Main.tsx │ │ │ │ ├── Primary │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Secondary │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Signers │ │ │ │ ├── LedgerSigner.ts │ │ │ │ └── VaultSigner │ │ │ │ │ ├── index.ts │ │ │ │ │ └── types.ts │ │ │ ├── Stat │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── StatCards │ │ │ │ ├── Button.tsx │ │ │ │ ├── Number.tsx │ │ │ │ ├── Pie.tsx │ │ │ │ ├── Text.tsx │ │ │ │ ├── Ticker.tsx │ │ │ │ ├── Timeleft.tsx │ │ │ │ └── types.ts │ │ │ ├── StatusLabel │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── StyledSlider │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── SubmitTx │ │ │ │ ├── ButtonSubmitLarge.tsx │ │ │ │ ├── Default.tsx │ │ │ │ ├── ManualSign │ │ │ │ │ ├── Ledger │ │ │ │ │ │ ├── Submit.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Vault │ │ │ │ │ │ ├── SignPrompt.tsx │ │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── WalletConnect │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Tips │ │ │ │ ├── Tip.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── types.ts │ │ │ ├── Tooltip │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ ├── Tx │ │ │ │ ├── Signer.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ValidatorList │ │ │ │ ├── Filters │ │ │ │ │ ├── FilterBadges.tsx │ │ │ │ │ └── FilterHeaders.tsx │ │ │ │ ├── Item.tsx │ │ │ │ ├── Prompts │ │ │ │ │ ├── FilterValidators.tsx │ │ │ │ │ └── OrderValidators.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ └── WithdrawPrompt │ │ │ │ └── index.tsx │ │ ├── main.tsx │ │ ├── overlay │ │ │ ├── canvas │ │ │ │ ├── CreatePool │ │ │ │ │ ├── Bond │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PoolName │ │ │ │ │ │ ├── Input.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── PoolRoles │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Summary │ │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── ManageNominations │ │ │ │ │ └── index.tsx │ │ │ │ ├── NominatorSetup │ │ │ │ │ ├── Bond │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Payee │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Summary │ │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Pool │ │ │ │ │ ├── Header.tsx │ │ │ │ │ ├── Nominations │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Overview │ │ │ │ │ │ ├── Addresses.tsx │ │ │ │ │ │ ├── JoinForm.tsx │ │ │ │ │ │ ├── Performance │ │ │ │ │ │ │ ├── ActiveGraph.tsx │ │ │ │ │ │ │ ├── InactiveGraph.tsx │ │ │ │ │ │ │ └── index.tsx │ │ │ │ │ │ ├── Roles.tsx │ │ │ │ │ │ ├── Stats.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Preloader.tsx │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── PoolMembers │ │ │ │ │ ├── Lists │ │ │ │ │ │ ├── FetchPage.tsx │ │ │ │ │ │ ├── Member.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── Members.tsx │ │ │ │ │ ├── Prompts │ │ │ │ │ │ ├── UnbondMember.tsx │ │ │ │ │ │ └── WithdrawMember.tsx │ │ │ │ │ └── index.tsx │ │ │ │ └── ValidatorMetrics │ │ │ │ │ ├── EraPoints │ │ │ │ │ ├── ActiveGraph.tsx │ │ │ │ │ └── InactiveGraph.tsx │ │ │ │ │ ├── Rewards │ │ │ │ │ ├── ActiveGraph.tsx │ │ │ │ │ └── InactiveGraph.tsx │ │ │ │ │ ├── ValidatorGeo.tsx │ │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── modals │ │ │ │ ├── Accounts │ │ │ │ ├── Account.tsx │ │ │ │ ├── Delegates │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── BalanceTest │ │ │ │ └── index.tsx │ │ │ │ ├── Bio │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ │ ├── Bond │ │ │ │ └── index.tsx │ │ │ │ ├── ChangePoolRoles │ │ │ │ ├── RoleChange.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── ClaimPayouts │ │ │ │ ├── Forms.tsx │ │ │ │ ├── Item.tsx │ │ │ │ ├── Overview.tsx │ │ │ │ ├── Utils.ts │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── ClaimReward │ │ │ │ └── index.tsx │ │ │ │ ├── DiscordSupport │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ │ ├── ExternalAccounts │ │ │ │ ├── Proxies.tsx │ │ │ │ ├── ReadOnly.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ │ ├── ImportAccounts │ │ │ │ ├── Ledger.tsx │ │ │ │ ├── Vault.tsx │ │ │ │ ├── WalletConnect.tsx │ │ │ │ └── index.tsx │ │ │ │ ├── Invite │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ │ ├── LeavePool │ │ │ │ └── index.tsx │ │ │ │ ├── MailSupport │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ │ ├── ManageFastUnstake │ │ │ │ └── index.tsx │ │ │ │ ├── ManagePool │ │ │ │ ├── Forms │ │ │ │ │ ├── ClaimCommission │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── LeavePool │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── ManageCommission │ │ │ │ │ │ ├── ChangeRate.tsx │ │ │ │ │ │ ├── CommissionCurrent.tsx │ │ │ │ │ │ ├── MaxCommission.tsx │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── provider │ │ │ │ │ │ │ ├── defaults.ts │ │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── RenamePool │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SetClaimPermission │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── SetPoolState │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Tasks.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── Networks │ │ │ │ ├── ProvidersPrompt.tsx │ │ │ │ ├── Wrapper.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── Plugins │ │ │ │ └── index.tsx │ │ │ │ ├── RewardCalculator │ │ │ │ └── index.tsx │ │ │ │ ├── SelectCurrency │ │ │ │ ├── Wrapper.ts │ │ │ │ └── index.tsx │ │ │ │ ├── SelectLanguage │ │ │ │ └── index.tsx │ │ │ │ ├── SetController │ │ │ │ └── index.tsx │ │ │ │ ├── StartNominating │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ │ ├── StopNominations │ │ │ │ └── index.tsx │ │ │ │ ├── Unbond │ │ │ │ └── index.tsx │ │ │ │ ├── UnlockChunks │ │ │ │ ├── Chunk.tsx │ │ │ │ ├── Forms.tsx │ │ │ │ ├── Overview.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ │ ├── Unstake │ │ │ │ └── index.tsx │ │ │ │ ├── UpdatePayee │ │ │ │ └── index.tsx │ │ │ │ ├── UpdateReserve │ │ │ │ └── index.tsx │ │ │ │ └── Utils │ │ │ │ └── StaticNote.tsx │ │ ├── pages │ │ │ ├── Nominate │ │ │ │ ├── Active │ │ │ │ │ ├── CommissionPrompt.tsx │ │ │ │ │ ├── ManageBond.tsx │ │ │ │ │ ├── Stats │ │ │ │ │ │ ├── ActiveNominators.tsx │ │ │ │ │ │ ├── MinimumActiveStake.tsx │ │ │ │ │ │ └── MinimumNominatorBond.tsx │ │ │ │ │ ├── Status │ │ │ │ │ │ ├── NewNominator.tsx │ │ │ │ │ │ ├── NominationStatus.tsx │ │ │ │ │ │ ├── PayoutDestinationStatus.tsx │ │ │ │ │ │ ├── UnclaimedPayoutsStatus.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── UnstakePrompts.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── NominationGeo │ │ │ │ │ ├── NominationGeoList │ │ │ │ │ │ ├── Node.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── Stats │ │ │ │ │ │ ├── AnalyzedDays.tsx │ │ │ │ │ │ ├── AnalyzedEras.tsx │ │ │ │ │ │ └── AnalyzedPayouts.tsx │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── Operators │ │ │ │ ├── Entity.tsx │ │ │ │ ├── Item.tsx │ │ │ │ ├── List.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── context.tsx │ │ │ │ ├── defaults.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Overview │ │ │ │ ├── AccountBalance │ │ │ │ │ ├── BalanceChart.tsx │ │ │ │ │ ├── BalanceLinks.tsx │ │ │ │ │ └── Value.tsx │ │ │ │ ├── ControllerPrompt.tsx │ │ │ │ ├── NetworkSats │ │ │ │ │ ├── Announcements.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Payouts │ │ │ │ │ ├── ActiveGraph.tsx │ │ │ │ │ ├── InactiveGraph.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── QuickActions │ │ │ │ │ ├── Disconnected.tsx │ │ │ │ │ ├── NotStaking.tsx │ │ │ │ │ ├── Staking.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── StakeStatus │ │ │ │ │ ├── Tips │ │ │ │ │ │ ├── Items.tsx │ │ │ │ │ │ ├── PageToggle.tsx │ │ │ │ │ │ ├── Syncing.tsx │ │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ │ ├── index.tsx │ │ │ │ │ │ └── types.ts │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── Stats │ │ │ │ │ ├── AveragelRewardRate.tsx │ │ │ │ │ ├── NextRewards.tsx │ │ │ │ │ └── SupplyStaked.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ └── index.tsx │ │ │ ├── Pools │ │ │ │ ├── ClosurePrompts.tsx │ │ │ │ ├── Favorites │ │ │ │ │ └── index.tsx │ │ │ │ ├── ManageBond.tsx │ │ │ │ ├── ManagePool │ │ │ │ │ ├── Wrappers.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── PoolAccount │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ └── index.tsx │ │ │ │ ├── PoolStats │ │ │ │ │ ├── Announcements.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Roles │ │ │ │ │ ├── RoleEditInput │ │ │ │ │ │ ├── Wrapper.ts │ │ │ │ │ │ └── index.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Stats │ │ │ │ │ ├── ActivePoolCount.tsx │ │ │ │ │ ├── MinCreateBond.tsx │ │ │ │ │ └── MinJoinBond.tsx │ │ │ │ ├── Status │ │ │ │ │ ├── MembershipStatus.tsx │ │ │ │ │ ├── NewMember.tsx │ │ │ │ │ ├── PoolStatus.tsx │ │ │ │ │ ├── RewardsStatus.tsx │ │ │ │ │ ├── index.tsx │ │ │ │ │ ├── types.ts │ │ │ │ │ └── useStatusButtons.tsx │ │ │ │ ├── context.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── Rewards │ │ │ │ ├── Overview │ │ │ │ │ ├── RecentPayouts │ │ │ │ │ │ ├── ActiveGraph.tsx │ │ │ │ │ │ ├── InactiveGraph.tsx │ │ │ │ │ │ └── index.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── RecentPayouts │ │ │ │ │ ├── PayoutList.tsx │ │ │ │ │ └── index.tsx │ │ │ │ ├── Stats │ │ │ │ │ ├── LastEraPayout.tsx │ │ │ │ │ ├── RewardCalculator.tsx │ │ │ │ │ └── RewardTrend.tsx │ │ │ │ ├── Wrappers.ts │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ └── Validators │ │ │ │ ├── AllValidators.tsx │ │ │ │ ├── Favorites.tsx │ │ │ │ ├── Stats │ │ │ │ ├── ActiveValidators.tsx │ │ │ │ ├── AverageCommission.tsx │ │ │ │ └── TotalValidators.tsx │ │ │ │ ├── context.tsx │ │ │ │ └── index.tsx │ │ ├── vite-env.d.ts │ │ └── workers │ │ │ ├── stakers.ts │ │ │ └── types.ts │ ├── tests │ │ └── graphs.test.ts │ ├── tsconfig.json │ ├── tsconfig.node.json │ └── vite.config.ts ├── assets │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── brands │ │ │ ├── discord.svg │ │ │ ├── discordOutline.svg │ │ │ └── vault.svg │ │ ├── chains │ │ │ ├── index.ts │ │ │ ├── kusamaIcon.svg │ │ │ ├── kusamaInline.svg │ │ │ ├── polkadotIcon.svg │ │ │ ├── polkadotInline.svg │ │ │ ├── westendIcon.svg │ │ │ └── westendInline.svg │ │ ├── icons │ │ │ ├── arrows.svg │ │ │ ├── book.svg │ │ │ ├── cloud.svg │ │ │ ├── envelope.svg │ │ │ ├── forum.svg │ │ │ ├── glasses.svg │ │ │ ├── language.svg │ │ │ ├── logo.svg │ │ │ ├── mail.svg │ │ │ └── moon.svg │ │ ├── index.ts │ │ ├── token │ │ │ ├── dot.svg │ │ │ ├── ksm.svg │ │ │ └── wnd.svg │ │ └── vite-env.d.ts │ ├── tsconfig.json │ └── vite.config.ts ├── consts │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── countries.ts │ │ ├── currencies.ts │ │ ├── index.ts │ │ ├── networks.ts │ │ ├── plugins.ts │ │ ├── proxies.ts │ │ └── util.ts │ └── tsconfig.json ├── dedot-api │ ├── package.json │ ├── src │ │ ├── consts │ │ │ ├── core.ts │ │ │ └── staking.ts │ │ ├── index.ts │ │ ├── query │ │ │ ├── bondedPool.ts │ │ │ ├── bondedPoolEntries.ts │ │ │ ├── erasStakersOverviewEntries.ts │ │ │ ├── erasStakersPagedEntries.ts │ │ │ ├── erasValidatorRewardMulti.ts │ │ │ ├── identityOfMulti.ts │ │ │ ├── index.ts │ │ │ ├── nominatorsMulti.ts │ │ │ ├── poolMembersMulti.ts │ │ │ ├── poolMetadataMulti.ts │ │ │ ├── proxies.ts │ │ │ ├── sessionValidators.ts │ │ │ ├── superOfMulti.ts │ │ │ ├── validatorEntries.ts │ │ │ └── validatorsMulti.ts │ │ ├── reset.ts │ │ ├── runtimeApi │ │ │ ├── balanceToPoints.ts │ │ │ ├── index.ts │ │ │ ├── pendingRewards.ts │ │ │ └── pointsToBalance.ts │ │ ├── services │ │ │ ├── index.ts │ │ │ ├── kusama.ts │ │ │ ├── polkadot.ts │ │ │ └── westend.ts │ │ ├── smoldot │ │ │ ├── providers.ts │ │ │ └── types.ts │ │ ├── spec │ │ │ ├── apiStatus.ts │ │ │ └── chainSpecs.ts │ │ ├── start.ts │ │ ├── subscribe │ │ │ ├── accountBalance.ts │ │ │ ├── activeEra.ts │ │ │ ├── activePool.ts │ │ │ ├── blockNumber.ts │ │ │ ├── bonded.ts │ │ │ ├── eraRewardPoints.ts │ │ │ ├── fastUnstakeConfig.ts │ │ │ ├── fastUnstakeQueue.ts │ │ │ ├── poolMembership.ts │ │ │ ├── poolsConfig.ts │ │ │ ├── proxies.ts │ │ │ ├── relayMetrics.ts │ │ │ ├── stakingLedger.ts │ │ │ └── stakingMetrics.ts │ │ ├── tx │ │ │ ├── batch.ts │ │ │ ├── createPool.ts │ │ │ ├── fastUnstakeDeregister.ts │ │ │ ├── fastUnstakeRegister.ts │ │ │ ├── index.ts │ │ │ ├── joinPool.ts │ │ │ ├── newNominator.ts │ │ │ ├── payoutStakersByPage.ts │ │ │ ├── poolBondExtra.ts │ │ │ ├── poolChill.ts │ │ │ ├── poolClaimCommission.ts │ │ │ ├── poolClaimPayout.ts │ │ │ ├── poolNominate.ts │ │ │ ├── poolSetClaimPermission.ts │ │ │ ├── poolSetCommission.ts │ │ │ ├── poolSetCommissionChangeRate.ts │ │ │ ├── poolSetCommissionMax.ts │ │ │ ├── poolSetMetadata.ts │ │ │ ├── poolSetState.ts │ │ │ ├── poolUnbond.ts │ │ │ ├── poolUpdateRoles.ts │ │ │ ├── poolWithdraw.ts │ │ │ ├── proxy.ts │ │ │ ├── setController.ts │ │ │ ├── stakingBondExtra.ts │ │ │ ├── stakingChill.ts │ │ │ ├── stakingNominate.ts │ │ │ ├── stakingRebond.ts │ │ │ ├── stakingSetPayee.ts │ │ │ ├── stakingUnbond.ts │ │ │ ├── stakingWithdraw.ts │ │ │ └── transferKeepAlive.ts │ │ ├── types │ │ │ ├── index.ts │ │ │ └── serviceDefault.ts │ │ └── util.ts │ └── tsconfig.json ├── global-bus │ ├── package.json │ ├── src │ │ ├── accountBalances │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── activeAddress │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── activeEra │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── activePoolIds │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── activePools │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── activeProxy │ │ │ ├── index.ts │ │ │ ├── local.ts │ │ │ └── private.ts │ │ ├── apiStatus │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── blockNumber │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── bonded │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── chainSpecs │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── consts │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── eraRewardPoints │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── externalAccounts │ │ │ ├── index.ts │ │ │ ├── private.ts │ │ │ └── util.ts │ │ ├── fastUnstakeConfig │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── fastUnstakeQueue │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── importedAccounts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── index.ts │ │ ├── networkConfig │ │ │ ├── index.ts │ │ │ ├── local.ts │ │ │ ├── private.ts │ │ │ └── util.ts │ │ ├── poolMemberships │ │ │ ├── defaults.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── poolsConfig │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── proxies │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── relayMetrics │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── serviceInterface │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── stakingLedgers │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── stakingMetrics │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ └── private.ts │ │ ├── syncStatus │ │ │ ├── default.ts │ │ │ ├── index.ts │ │ │ ├── private.ts │ │ │ └── util.ts │ │ └── util.ts │ └── tsconfig.json ├── locales │ ├── .scripts │ │ ├── localeOrderKeys.cjs │ │ ├── localeValidate.cjs │ │ └── utils.cjs │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── index.ts │ │ ├── resources │ │ │ ├── en │ │ │ │ ├── app.json │ │ │ │ ├── help.json │ │ │ │ ├── modals.json │ │ │ │ ├── pages.json │ │ │ │ └── tips.json │ │ │ ├── es │ │ │ │ ├── app.json │ │ │ │ ├── help.json │ │ │ │ ├── modals.json │ │ │ │ ├── pages.json │ │ │ │ └── tips.json │ │ │ └── zh │ │ │ │ ├── app.json │ │ │ │ ├── help.json │ │ │ │ ├── modals.json │ │ │ │ ├── pages.json │ │ │ │ └── tips.json │ │ ├── types.ts │ │ └── util │ │ │ ├── currency.ts │ │ │ ├── index.ts │ │ │ └── language.ts │ └── tsconfig.json ├── plugin-staking-api │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── Client.tsx │ │ ├── index.tsx │ │ ├── queries │ │ │ ├── activeValidatorRanks.tsx │ │ │ ├── canFastUnstake.tsx │ │ │ ├── nominatorRewardTrend.tsx │ │ │ ├── poolCandidates.tsx │ │ │ ├── poolEraPoints.tsx │ │ │ ├── poolRewardTrend.tsx │ │ │ ├── poolRewards.tsx │ │ │ ├── rewards.tsx │ │ │ ├── tokenPrice.tsx │ │ │ ├── unclaimedRewards.tsx │ │ │ ├── validatorEraPoints.tsx │ │ │ ├── validatorEraPointsBatch.tsx │ │ │ └── validatorRewards.tsx │ │ ├── types.ts │ │ └── util.ts │ └── tsconfig.json ├── rpc-config │ ├── package.json │ ├── src │ │ ├── _generated │ │ │ └── index.json │ │ └── check-rpc.ts │ ├── tsconfig.json │ └── tsup.config.ts ├── styles │ ├── CHANGELOG.md │ ├── accents │ │ ├── kusama.scss │ │ ├── polkadot.scss │ │ └── westend.scss │ ├── fonts │ │ ├── Inter500.woff2 │ │ ├── Inter600.woff2 │ │ ├── Inter700.woff2 │ │ ├── Inter800.woff2 │ │ ├── Inter900.woff2 │ │ ├── Poppins700.woff2 │ │ └── font.scss │ ├── package.json │ └── theme │ │ ├── _variables.scss │ │ ├── index.scss │ │ └── theme.scss ├── types │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── accounts.ts │ │ ├── balances.ts │ │ ├── common.ts │ │ ├── components.ts │ │ ├── fastUnstake.ts │ │ ├── identity.ts │ │ ├── index.ts │ │ ├── interfaces.ts │ │ ├── networks.ts │ │ ├── nominate.ts │ │ ├── overlay.ts │ │ ├── plugins.ts │ │ ├── pools.ts │ │ ├── staking.ts │ │ ├── stakingLedger.ts │ │ ├── syncing.ts │ │ └── validators.ts │ └── tsconfig.json ├── ui-buttons │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── ButtonAccount │ │ │ ├── Label.tsx │ │ │ ├── Standalone.tsx │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonCopy │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonHeader │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonHelp │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonMenu │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonModal │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonMono │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonMonoInvert │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonOption │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonPrimary │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonPrimaryInvert │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonSecondary │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonSubmit │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonSubmitInvert │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonTab │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonTertiary │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── ButtonText │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── MultiButton │ │ │ ├── Button.tsx │ │ │ ├── Container.tsx │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ ├── PopoverTab │ │ │ ├── Button │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Container │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── QuickAction │ │ │ ├── Button │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Container │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ ├── common.module.scss │ │ ├── index.tsx │ │ ├── types.ts │ │ └── util.ts │ └── tsconfig.json ├── ui-core │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── base │ │ │ ├── AccountImport │ │ │ │ ├── Empty │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Header │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Inactive │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Item │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── SubHeading │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── types.ts │ │ │ ├── ButtonRow │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── CardHeader │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── CardLabel │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Countdown │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Identity │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Offline │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Page │ │ │ │ ├── Body │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Container │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Entry │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Footer │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Heading │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Main │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Row │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── RowSection │ │ │ │ │ ├── index.module.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Side │ │ │ │ │ ├── index.module.scss │ │ │ │ │ ├── index.tsx │ │ │ │ │ └── types.ts │ │ │ │ ├── Title │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── RewardGrid │ │ │ │ ├── Cell │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Cells │ │ │ │ │ └── index.tsx │ │ │ │ ├── Head │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Label │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Root │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Row │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── common.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Separator │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Spinner │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Stat │ │ │ │ ├── Card │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Content │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Graphic │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Row │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Subtitle │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Title │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ ├── Total │ │ │ │ │ ├── index.module.scss │ │ │ │ │ └── index.tsx │ │ │ │ └── index.tsx │ │ │ ├── TokenFiat │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Tooltip │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── TooltipArea │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── canvas │ │ │ ├── AccountTitle │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Close │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Container │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Content │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── FootFullWidth │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Footer │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── GraphContainer │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── GraphInner │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Head │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── HeadFullWidth │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── HeadTags │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Interface │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Loader │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Main │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Preload │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Scroll │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Stat │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Subheading │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── SyncingBadge │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Title │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── _variables.scss │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── common.module.scss │ │ ├── input │ │ │ ├── Switch │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── TokenInput │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── list │ │ │ ├── Checkbox │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Graph │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── HeaderButton │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── HeaderButtonRow │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Identity │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Label │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── LabelRow │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Separator │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── modal │ │ │ ├── AddressHeader │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── ButtonList │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Card │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Close │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Container │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Content │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── CustomHeader │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── FixedTitle │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Multi │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── MultiThree │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── MultiTwo │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Notes │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Padding │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Scroll │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Section │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Title │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Warnings │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── overlay │ │ │ ├── Backdrop │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ └── popover │ │ │ ├── ConnectItem │ │ │ ├── Container │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Heading │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Icon │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Item │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Logo │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── WebUrl │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ │ ├── MenuItem │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ │ ├── Padding │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ │ ├── Popover │ │ │ ├── index.module.scss │ │ │ └── index.tsx │ │ │ ├── Stat │ │ │ ├── Label │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ ├── Value │ │ │ │ ├── index.module.scss │ │ │ │ └── index.tsx │ │ │ └── index.tsx │ │ │ └── index.tsx │ └── tsconfig.json ├── ui-graphs │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── Pie │ │ │ ├── index.module.scss │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ ├── index.tsx │ │ ├── types.ts │ │ └── util.ts │ └── tsconfig.json ├── ui-identity │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── index.tsx │ │ └── types.ts │ └── tsconfig.json ├── ui-overlay │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ │ ├── Background.tsx │ │ ├── Canvas.tsx │ │ ├── Close.tsx │ │ ├── CloseCanvas.tsx │ │ ├── Modal.tsx │ │ ├── Overlay.tsx │ │ ├── Provider │ │ │ ├── defaults.ts │ │ │ ├── index.tsx │ │ │ └── types.ts │ │ └── index.tsx │ └── tsconfig.json └── utils │ ├── CHANGELOG.md │ ├── package.json │ ├── src │ └── index.ts │ └── tsconfig.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── release-please-config.json ├── tsconfig.base.json ├── tsconfig.json └── tsconfig.react.json /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | pnpm-debug.log* 6 | lerna-debug.log* 7 | 8 | node_modules 9 | dist 10 | build 11 | dist-ssr 12 | *.local 13 | 14 | # Editor directories and files 15 | .vscode/* 16 | !.vscode/extensions.json 17 | .idea 18 | .DS_Store 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /.licenserc.json: -------------------------------------------------------------------------------- 1 | { 2 | "**/*.{js,ts,tsx}": [ 3 | "// Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors", 4 | "// SPDX-License-Identifier: GPL-3.0-only" 5 | ], 6 | "**/*.{.css}": [ 7 | "/* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors", 8 | "SPDX-License-Identifier: GPL-3.0-only */" 9 | ], 10 | "ignore": ["testdata", "npm", "public/", "Dockerfile", "packages/app/src/config/validators/"] 11 | } 12 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v20.10.0 2 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | **/build 2 | **/node_modules 3 | **/package.json 4 | **/package-lock.json 5 | **/.eslintrc.js 6 | **/dist 7 | **/pnpm-lock.yaml 8 | 9 | .licenserc.json 10 | CHANGELOG.md 11 | 12 | packages/app/src/img/**/* 13 | -------------------------------------------------------------------------------- /.release-please-manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "packages/app": "1.9.0", 3 | "packages/assets": "1.2.0", 4 | "packages/consts": "1.2.0", 5 | "packages/locales": "1.2.0", 6 | "packages/plugin-staking-api": "1.2.0", 7 | "packages/styles": "1.2.0", 8 | "packages/types": "1.2.0", 9 | "packages/ui-buttons": "1.2.0", 10 | "packages/ui-core": "1.2.0", 11 | "packages/ui-graphs": "1.1.0", 12 | "packages/ui-identity": "1.1.0", 13 | "packages/ui-overlay": "1.2.0", 14 | "packages/utils": "1.1.0" 15 | } 16 | -------------------------------------------------------------------------------- /check-markdown-links-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "ignorePatterns": [ 3 | { 4 | "pattern": "^https://github.com/polkadot-cloud/polkadot-staking-dashboard/compare/v" 5 | } 6 | ], 7 | "httpHeaders": [ 8 | { 9 | "urls": [ 10 | "https://github.com/", 11 | "https://guides.github.com/", 12 | "https://help.github.com/", 13 | "https://docs.github.com/" 14 | ], 15 | "headers": { 16 | "Accept-Encoding": "zstd, br, gzip, deflate" 17 | } 18 | } 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /env.d.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | declare module '*.module.scss' { 5 | const classes: Record 6 | export default classes 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/.env: -------------------------------------------------------------------------------- 1 | # display an organisation label in the network bar 2 | VITE_ORGANISATION=Polkadot Cloud 3 | 4 | # provide a privacy policy url in the network bar 5 | VITE_PRIVACY_URL='https://polkadot.cloud/privacy' 6 | 7 | # provide a disclaimer url in the network bar 8 | VITE_DISCLAIMER_URL='https://polkadot.cloud/disclaimer' 9 | 10 | # provid a legal disclaimer url in the network bar 11 | # VITE_LEGAL_DISCLOSURES_URL= 12 | -------------------------------------------------------------------------------- /packages/app/.shell/build-container.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | podman build \ 4 | -t polkadot-staking-dashboard \ 5 | -t psd \ 6 | . 7 | -------------------------------------------------------------------------------- /packages/app/public/_redirects: -------------------------------------------------------------------------------- 1 | /dashboard/* / 301! 2 | /updates https://polkadot.network/tag/staking-updates/ 301! 3 | -------------------------------------------------------------------------------- /packages/app/public/favicons/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/favicons/apple-touch-icon.png -------------------------------------------------------------------------------- /packages/app/public/favicons/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/favicons/favicon-96x96.png -------------------------------------------------------------------------------- /packages/app/public/favicons/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/favicons/favicon.ico -------------------------------------------------------------------------------- /packages/app/public/favicons/web-app-manifest-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/favicons/web-app-manifest-192x192.png -------------------------------------------------------------------------------- /packages/app/public/favicons/web-app-manifest-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/favicons/web-app-manifest-512x512.png -------------------------------------------------------------------------------- /packages/app/public/fonts/Inter.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/fonts/Inter.ttf -------------------------------------------------------------------------------- /packages/app/public/fonts/Unbounded.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/fonts/Unbounded.ttf -------------------------------------------------------------------------------- /packages/app/public/img/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/img/og-image.png -------------------------------------------------------------------------------- /packages/app/public/img/wc-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/img/wc-icon.png -------------------------------------------------------------------------------- /packages/app/public/lottie/analytics-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/analytics-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/analytics-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/analytics-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/globe-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/globe-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/globe-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/globe-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/groups-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/groups-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/groups-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/groups-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/label-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/label-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/label-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/label-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/refresh-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/refresh-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/refresh-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/refresh-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/trending-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/trending-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/trending-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/trending-light.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/view-dark.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/view-dark.lottie -------------------------------------------------------------------------------- /packages/app/public/lottie/view-light.lottie: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/app/public/lottie/view-light.lottie -------------------------------------------------------------------------------- /packages/app/public/robots.txt: -------------------------------------------------------------------------------- 1 | # https://www.robotstxt.org/robotstxt.html 2 | User-agent: * 3 | Disallow: 4 | -------------------------------------------------------------------------------- /packages/app/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Polkadot Cloud Staking", 3 | "short_name": "Staking", 4 | "icons": [ 5 | { 6 | "src": "/favicons/web-app-manifest-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png", 9 | "purpose": "maskable" 10 | }, 11 | { 12 | "src": "/favicons/web-app-manifest-512x512.png", 13 | "sizes": "512x512", 14 | "type": "image/png", 15 | "purpose": "maskable" 16 | } 17 | ], 18 | "theme_color": "#ffffff", 19 | "background_color": "#ffffff", 20 | "display": "standalone" 21 | } 22 | -------------------------------------------------------------------------------- /packages/app/src/StakingApi/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { NetworkId } from 'types' 5 | 6 | export interface Props { 7 | who: string 8 | network: NetworkId 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/config/validators/CoinbaseCloud.tsx: -------------------------------------------------------------------------------- 1 | const CoinbaseCloud = () => ( 2 | 3 | 4 | 8 | 9 | ) 10 | 11 | export default CoinbaseCloud 12 | -------------------------------------------------------------------------------- /packages/app/src/config/validators/Decentradot.tsx: -------------------------------------------------------------------------------- 1 | const Decentradot = () => ( 2 | 3 | 4 | 8 | 9 | ) 10 | 11 | export default Decentradot 12 | -------------------------------------------------------------------------------- /packages/app/src/config/validators/ProStakers.tsx: -------------------------------------------------------------------------------- 1 | const ProStakers = () => ( 2 | 3 | 4 | 5 | 💎 6 | 7 | 8 | ) 9 | 10 | export default ProStakers 11 | -------------------------------------------------------------------------------- /packages/app/src/config/validators/Saxemberg.tsx: -------------------------------------------------------------------------------- 1 | const Saxemberg = () => ( 2 | 3 | 4 | 5 | ) 6 | export default Saxemberg 7 | -------------------------------------------------------------------------------- /packages/app/src/config/validators/TurboFlakes.tsx: -------------------------------------------------------------------------------- 1 | const TurboFlakes = () => ( 2 | 3 | 4 | 5 | 9 | 10 | ) 11 | 12 | export default TurboFlakes 13 | -------------------------------------------------------------------------------- /packages/app/src/contexts/ActiveAccounts/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { MaybeString } from '@w3ux/types' 5 | import type { ActiveAccount, ActiveProxy } from 'types' 6 | 7 | export interface ActiveAccountsContextInterface { 8 | activeAccount: ActiveAccount 9 | activeAddress: MaybeString 10 | activeProxy: ActiveProxy | null 11 | activeProxyType: string | null 12 | setActiveAccount: ( 13 | account: ActiveAccount, 14 | updateLocalStorage?: boolean 15 | ) => void 16 | } 17 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Connect/ImportedAccounts/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ImportedAccount, MaybeAddress } from 'types' 5 | 6 | export interface ImportedAccountsContextInterface { 7 | accounts: ImportedAccount[] 8 | getAccount: (address: MaybeAddress) => ImportedAccount | null 9 | isReadOnlyAccount: (address: MaybeAddress) => boolean 10 | accountHasSigner: (address: MaybeAddress) => boolean 11 | requiresManualSign: (address: MaybeAddress) => boolean 12 | stringifiedAccountsKey: string 13 | } 14 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Currency/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type CurrencyContextInterface = { 5 | currency: string 6 | setCurrency: (currency: string) => void 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/contexts/FastUnstake/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { FastUnstakeResult } from 'plugin-staking-api/types' 5 | import type { FastUnstakeHead, FastUnstakeQueue } from 'types' 6 | 7 | export interface FastUnstakeContextInterface { 8 | exposed: boolean 9 | queueDeposit: FastUnstakeQueue 10 | head: FastUnstakeHead | undefined 11 | counterForQueue: number | undefined 12 | fastUnstakeStatus: FastUnstakeResult | null 13 | setFastUnstakeStatus: (status: FastUnstakeResult | null) => void 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Filters/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { FilterItem } from './types' 5 | 6 | export const defaultIncludes: FilterItem[] = [ 7 | { 8 | key: 'pools', 9 | filters: ['active'], 10 | }, 11 | ] 12 | 13 | export const defaultExcludes: FilterItem[] = [ 14 | { 15 | key: 'pools', 16 | filters: ['locked', 'destroying'], 17 | }, 18 | ] 19 | -------------------------------------------------------------------------------- /packages/app/src/contexts/LedgerHardware/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export const defaultFeedback = { 5 | message: null, 6 | helpKey: null, 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Network/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { NetworkId } from 'types' 5 | 6 | export interface NetworkContextInterface { 7 | network: NetworkId 8 | switchNetwork: (network: NetworkId) => Promise 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/contexts/NominatorSetups/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { NominatorProgress } from './types' 5 | 6 | export const defaultNominatorProgress: NominatorProgress = { 7 | payee: { 8 | destination: null, 9 | account: null, 10 | }, 11 | nominations: [], 12 | bond: '', 13 | } 14 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Operators/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ValidatorEntry } from '@w3ux/validator-assets' 5 | 6 | export interface OperatorsContextInterface { 7 | validatorOperators: ValidatorEntry[] 8 | } 9 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Payouts/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export const defaultUnclaimedRewards = { 5 | total: '0', 6 | entries: [], 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Payouts/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { UnclaimedRewards } from 'plugin-staking-api/types' 5 | 6 | export interface PayoutsContextInterface { 7 | unclaimedRewards: UnclaimedRewards 8 | setUnclaimedRewards: (unclaimedRewards: UnclaimedRewards) => void 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Plugins/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Plugin } from 'types' 5 | 6 | export interface PluginsContextInterface { 7 | togglePlugin: (k: Plugin) => void 8 | pluginEnabled: (key: Plugin) => boolean 9 | plugins: Plugin[] 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/contexts/PoolSetups/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { PoolProgress } from './types' 5 | 6 | export const defaultPoolProgress: PoolProgress = { 7 | metadata: '', 8 | bond: '', 9 | nominations: [], 10 | roles: null, 11 | } 12 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Pools/ActivePool/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export const nominationStatus = {} 5 | 6 | export const defaultPoolRoles = { 7 | depositor: '', 8 | nominator: '', 9 | root: '', 10 | bouncer: '', 11 | } 12 | 13 | export const defaultPoolNominations = { 14 | targets: [], 15 | submittedIn: 0, 16 | } 17 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Pools/FavoritePools/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface FavoritePoolsContextState { 5 | favorites: string[] 6 | addFavorite: (address: string) => void 7 | removeFavorite: (address: string) => void 8 | } 9 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Pools/util.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { ellipsisFn } from '@w3ux/utils' 5 | import type { AnyJson } from 'types' 6 | 7 | /** 8 | * @name determinePoolDisplay 9 | * @summary A pool will be displayed with either its set metadata or its address. 10 | */ 11 | export const determinePoolDisplay = (address: string, batchItem: AnyJson) => { 12 | const defaultDisplay = ellipsisFn(address, 6) 13 | return batchItem || defaultDisplay 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Staking/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { EraStakers } from 'contexts/Staking/types' 5 | 6 | export const defaultEraStakers: EraStakers = { 7 | activeAccountOwnStake: [], 8 | activeValidators: 0, 9 | stakers: [], 10 | totalActiveNominators: 0, 11 | } 12 | -------------------------------------------------------------------------------- /packages/app/src/contexts/ThemeValues/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface ThemeValuesContextInterface { 5 | getThemeValue: (name: string) => string 6 | } 7 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Themes/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { RefObject } from 'react' 5 | 6 | export type Theme = 'light' | 'dark' 7 | 8 | export interface ThemeContextInterface { 9 | themeElementRef: RefObject 10 | toggleTheme: (str?: Theme) => void 11 | mode: Theme 12 | } 13 | -------------------------------------------------------------------------------- /packages/app/src/contexts/TokenPrice/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { TokenPricesContextInterface } from './types' 5 | 6 | export const defaultTokenPrice: TokenPricesContextInterface = { 7 | price: 0, 8 | change: 0, 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/contexts/TokenPrice/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type TokenPricesContextInterface = { 5 | price: number 6 | change: number 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Tooltip/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface TooltipContextInterface { 5 | openTooltip: () => void 6 | closeTooltip: () => void 7 | setTooltipPosition: (x: number, y: number) => void 8 | showTooltip: () => void 9 | setTooltipTextAndOpen: (t: string) => void 10 | open: number 11 | show: number 12 | position: [number, number] 13 | text: string 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/src/contexts/TxMeta/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { TxSubmissionItem } from 'controllers/TxSubmission/types' 5 | 6 | export interface TxMetaContextInterface { 7 | uids: TxSubmissionItem[] 8 | getTxSubmission: (uid?: number) => TxSubmissionItem | undefined 9 | getTxSubmissionByTag: (tag: string) => TxSubmissionItem | undefined 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/contexts/Validators/ValidatorEntries/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import BigNumber from 'bignumber.js' 5 | 6 | export const defaultAverageEraValidatorReward = { 7 | days: 0, 8 | reward: new BigNumber(0), 9 | } 10 | 11 | export const defaultValidatorsData = { 12 | entries: [], 13 | notFullCommissionCount: 0, 14 | totalNonAllCommission: new BigNumber(0), 15 | } 16 | -------------------------------------------------------------------------------- /packages/app/src/controllers/OnlineStatus/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface OnlineStatusEvent { 5 | online: boolean 6 | } 7 | -------------------------------------------------------------------------------- /packages/app/src/controllers/TxSubmission/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { MaybeAddress } from 'types' 5 | 6 | export type TxSubmissionItem = { 7 | uid: number 8 | tag?: string 9 | fee: bigint 10 | from: MaybeAddress 11 | submitted: boolean 12 | pending: boolean 13 | } 14 | 15 | export interface TxStatusHandlers { 16 | onReady: () => void 17 | onInBlock: () => void 18 | onFinalized: () => void 19 | onFailed: (err: Error) => void 20 | onError: (type?: string) => void 21 | } 22 | -------------------------------------------------------------------------------- /packages/app/src/controllers/utils.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | // Detect if an event is a CustomEvent by checking if it has a `detail` property 5 | export const isCustomEvent = (event: Event): event is CustomEvent => 6 | 'detail' in event 7 | -------------------------------------------------------------------------------- /packages/app/src/hooks/useAverageRewardRate/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import BigNumber from 'bignumber.js' 5 | import type { AverageRewardRate } from './types' 6 | 7 | export const defaultAverageRewardRate: AverageRewardRate = { 8 | inflationToStakers: new BigNumber(0), 9 | avgRateBeforeCommission: new BigNumber(0), 10 | avgRateAfterCommission: new BigNumber(0), 11 | } 12 | -------------------------------------------------------------------------------- /packages/app/src/hooks/useAverageRewardRate/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type BigNumber from 'bignumber.js' 5 | 6 | export interface UseAverageRewardRate { 7 | getAverageRewardRate: (compounded: boolean) => AverageRewardRate 8 | } 9 | 10 | export interface AverageRewardRate { 11 | inflationToStakers: BigNumber 12 | avgRateBeforeCommission: BigNumber 13 | avgRateAfterCommission: BigNumber 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/src/hooks/useFillVariables/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface FillVariableItem { 5 | title: string 6 | description: string[] 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/library/Account/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ActivePool, MaybeAddress } from 'types' 5 | 6 | export interface AccountProps { 7 | value: MaybeAddress 8 | readOnly?: boolean 9 | onClick?: () => void 10 | className?: string 11 | } 12 | 13 | export interface PoolAccountProps { 14 | pool: ActivePool 15 | label: string 16 | syncing: boolean 17 | } 18 | -------------------------------------------------------------------------------- /packages/app/src/library/AccountInput/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { MaybeAddress } from 'types' 5 | 6 | export interface AccountInputProps { 7 | successCallback: (a: string) => Promise 8 | resetCallback?: () => void 9 | defaultLabel: string 10 | resetOnSuccess?: boolean 11 | successLabel?: string 12 | locked?: boolean 13 | inactive?: boolean 14 | disallowAlreadyImported?: boolean 15 | initialValue?: MaybeAddress 16 | border?: boolean 17 | } 18 | -------------------------------------------------------------------------------- /packages/app/src/library/Announcements/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface HeaderProps { 5 | items: PoolStatLabel[] 6 | } 7 | 8 | export interface PoolStatLabel { 9 | label: string 10 | value: string 11 | button?: { 12 | text: string 13 | onClick: () => void 14 | disabled: boolean 15 | } 16 | helpKey?: string 17 | } 18 | -------------------------------------------------------------------------------- /packages/app/src/library/Balance/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Value } from './Value' 5 | import { WithFiat } from './WithFiat' 6 | 7 | export const Balance = { 8 | Value, 9 | WithFiat, 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/library/BarChart/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | // Bar segment width threshold (as a percentage) to display graph labels. 5 | export const BarSegmentShowLabelThreshold = 9 6 | -------------------------------------------------------------------------------- /packages/app/src/library/BarChart/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | 6 | export type DataClass = 'd1' | 'd2' | 'd3' | 'd4' 7 | 8 | export interface LegendItemProps { 9 | dataClass?: DataClass 10 | label: string 11 | helpKey?: string 12 | button?: ReactNode 13 | } 14 | 15 | export interface BarSegmentProps { 16 | dataClass: DataClass 17 | label?: string 18 | widthPercent: number 19 | flexGrow: number 20 | forceShow?: boolean 21 | } 22 | -------------------------------------------------------------------------------- /packages/app/src/library/Countdown/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { TimeLeftFormatted } from '@w3ux/types' 5 | 6 | export interface CountdownProps { 7 | timeleft: TimeLeftFormatted 8 | markup?: boolean 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/library/EstimatedTxFee/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | p { 8 | color: var(--text-color-secondary); 9 | padding: 0; 10 | font-size: 1rem; 11 | margin: 0.5rem 0; 12 | 13 | > span { 14 | margin: 0 0.5rem 0 0; 15 | } 16 | } 17 | ` 18 | -------------------------------------------------------------------------------- /packages/app/src/library/EstimatedTxFee/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface EstimatedTxFeeProps { 5 | uid?: number 6 | format?: string 7 | } 8 | -------------------------------------------------------------------------------- /packages/app/src/library/Filter/Container.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import { Wrapper } from './Wrappers' 6 | 7 | export const Container = ({ children }: { children: ReactNode }) => ( 8 | 9 |
10 |
{children}
11 |
12 |
13 | ) 14 | -------------------------------------------------------------------------------- /packages/app/src/library/Form/ClaimPermissionInput/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ClaimPermission } from 'types' 5 | 6 | export interface ClaimPermissionInputProps { 7 | current: ClaimPermission 8 | onChange: (value: ClaimPermission) => void 9 | disabled?: boolean 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/library/Form/MinDelayInput/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface MinDelayProps { 5 | initial: number 6 | field: string 7 | label: string 8 | handleChange: (field: string, value: number) => void 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/library/Form/Warning/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { WarningProps } from '../types' 5 | import { Wrapper } from './Wrapper' 6 | 7 | export const Warning = ({ text }: WarningProps) => ( 8 | 9 |

{text}

10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/app/src/library/GenerateNominations/Controls/Wrappers.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const MenuWrapper = styled.div` 7 | width: 100%; 8 | display: flex; 9 | align-items: center; 10 | background: var(--background-default); 11 | height: 3.25rem; 12 | ` 13 | -------------------------------------------------------------------------------- /packages/app/src/library/GenerateNominations/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | display: flex; 8 | flex-flow: column wrap; 9 | width: 100%; 10 | 11 | > div:last-child { 12 | width: 100%; 13 | } 14 | ` 15 | -------------------------------------------------------------------------------- /packages/app/src/library/Headers/Popovers/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Dispatch, SetStateAction } from 'react' 5 | 6 | export interface ToggleConnectProps { 7 | openConnect: boolean 8 | setOpenConnect: Dispatch> 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/library/Help/Items/ActiveDefinition.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { DefinitionWrapper } from '../Wrappers' 5 | 6 | export const ActiveDefinition = ({ 7 | description, 8 | }: { 9 | description: string[] 10 | }) => ( 11 | 12 |
13 | {description.map((item, index: number) => ( 14 |

15 | {item} 16 |

17 | ))} 18 |
19 |
20 | ) 21 | -------------------------------------------------------------------------------- /packages/app/src/library/Help/Items/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface ExternalProps { 5 | width: string | number 6 | title: string 7 | url: string 8 | website: string 9 | } 10 | 11 | export interface DefinitionProps { 12 | title: string 13 | description: string[] 14 | } 15 | -------------------------------------------------------------------------------- /packages/app/src/library/ListItem/Buttons/CopyAddress.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { ButtonCopy } from 'library/ButtonCopy' 5 | import type { CopyAddressProps } from '../types' 6 | 7 | export const CopyAddress = ({ address }: CopyAddressProps) => ( 8 | 9 | ) 10 | -------------------------------------------------------------------------------- /packages/app/src/library/Loader/Announcement.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { LoaderWrapper } from './Wrappers' 5 | 6 | export const Announcement = () => ( 7 | 8 | ) 9 | -------------------------------------------------------------------------------- /packages/app/src/library/Loader/CallToAction.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { LoaderWrapper } from './Wrappers' 5 | 6 | export const CallToActionLoader = () => ( 7 | 15 | ) 16 | -------------------------------------------------------------------------------- /packages/app/src/library/Nominations/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | flex: 1; 8 | display: flex; 9 | flex-flow: column wrap; 10 | width: 100%; 11 | 12 | .head { 13 | flex: 1; 14 | display: flex; 15 | flex-flow: row wrap; 16 | padding: 0 0.25rem; 17 | margin-top: 1rem; 18 | 19 | > h3 { 20 | flex: 1; 21 | } 22 | } 23 | ` 24 | -------------------------------------------------------------------------------- /packages/app/src/library/Nominations/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ListFormat } from 'contexts/List/types' 5 | import type { AnyJson, Validator } from 'types' 6 | 7 | export interface ManageNominationsInterface { 8 | addToSelected: (item: AnyJson) => void 9 | removeFromSelected: (item: AnyJson) => void 10 | setListFormat: (format: ListFormat) => void 11 | resetSelected: () => void 12 | selected: Validator[] 13 | listFormat: ListFormat 14 | selectTogglable: boolean 15 | } 16 | -------------------------------------------------------------------------------- /packages/app/src/library/PayeeInput/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { PayeeConfig } from 'contexts/NominatorSetups/types' 5 | import type { Dispatch, SetStateAction } from 'react' 6 | import type { MaybeAddress } from 'types' 7 | 8 | export interface PayeeInputProps { 9 | payee: PayeeConfig 10 | account: MaybeAddress 11 | setAccount: Dispatch> 12 | handleChange: (a: MaybeAddress) => void 13 | } 14 | -------------------------------------------------------------------------------- /packages/app/src/library/Pool/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { BondedPool, DisplayFor } from 'types' 5 | 6 | export interface PoolProps { 7 | pool: BondedPool 8 | } 9 | 10 | export interface RewardProps { 11 | address: string 12 | displayFor?: DisplayFor 13 | } 14 | 15 | export interface RewardsGraphProps { 16 | points: number[] 17 | syncing: boolean 18 | } 19 | -------------------------------------------------------------------------------- /packages/app/src/library/PoolList/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { BondedPool } from 'types' 5 | 6 | export interface PoolListProps { 7 | allowMoreCols?: boolean 8 | allowSearch?: boolean 9 | allowListFormat?: boolean 10 | pools?: BondedPool[] 11 | itemsPerPage?: number 12 | } 13 | -------------------------------------------------------------------------------- /packages/app/src/library/QRCode/qrcode.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import _qrcode from 'qrcode-generator' 5 | import type { AnyJson } from 'types' 6 | 7 | // A small hurdle to jump through, just to get the default/default correct (as generated) 8 | const qrcode: typeof _qrcode = _qrcode 9 | 10 | // HACK The default function take string -> number[], the Uint8array is compatible 11 | // with that signature and the use thereof 12 | ;(qrcode as AnyJson).stringToBytes = (data: Uint8Array): Uint8Array => data 13 | 14 | export { qrcode } 15 | -------------------------------------------------------------------------------- /packages/app/src/library/QrReader/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ImportedAccount } from 'types' 5 | 6 | export interface QrReaderProps { 7 | network: string 8 | ss58: number 9 | onSuccess: (account: ImportedAccount) => void 10 | } 11 | -------------------------------------------------------------------------------- /packages/app/src/library/SetupSteps/Footer/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | width: 100%; 8 | display: flex; 9 | flex-flow: row wrap; 10 | align-items: center; 11 | justify-content: flex-end; 12 | padding: 0 0.25rem; 13 | margin-top: 1rem; 14 | ` 15 | -------------------------------------------------------------------------------- /packages/app/src/library/SideMenu/Heading/Heading.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { HeadingProps } from '../types' 5 | import { Wrapper } from './Wrapper' 6 | 7 | export const Heading = ({ title, minimised }: HeadingProps) => ( 8 | 9 | {minimised ?
:
{title}
} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/app/src/library/Stat/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { IconProp } from '@fortawesome/fontawesome-svg-core' 5 | import type { AnyJson, MaybeAddress } from 'types' 6 | 7 | export interface StatProps { 8 | label: string 9 | stat: AnyJson 10 | type?: string 11 | buttons?: AnyJson[] 12 | dimmed?: boolean 13 | helpKey: string 14 | icon?: IconProp 15 | buttonType?: string 16 | } 17 | 18 | export interface StatAddress { 19 | address: MaybeAddress 20 | display: string 21 | } 22 | -------------------------------------------------------------------------------- /packages/app/src/library/StatusLabel/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Plugin } from 'types' 5 | 6 | export interface StatusLabelProps { 7 | hideIcon?: boolean 8 | status: string 9 | statusFor?: Plugin 10 | title: string 11 | topOffset?: string 12 | helpKey?: string 13 | } 14 | 15 | export interface WrapperProps { 16 | $topOffset?: string 17 | } 18 | -------------------------------------------------------------------------------- /packages/app/src/library/StyledSlider/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | flex-grow: 1; 8 | 9 | &.no-padding { 10 | padding-left: 0; 11 | } 12 | 13 | .rc-slider-handle-dragging { 14 | box-shadow: 0 0 0 5px var(--accent-color-transparent) !important; 15 | } 16 | ` 17 | -------------------------------------------------------------------------------- /packages/app/src/library/StyledSlider/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface StyledSliderProps { 5 | min?: number 6 | max?: number 7 | value: number 8 | step: number 9 | classNaame?: string 10 | onChange: (val: number | number[]) => void 11 | } 12 | -------------------------------------------------------------------------------- /packages/app/src/library/Tips/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface TipProps { 5 | title: string 6 | description: string[] 7 | page: string 8 | } 9 | -------------------------------------------------------------------------------- /packages/app/src/library/Tx/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactElement } from 'react' 5 | import type { DisplayFor } from 'types' 6 | 7 | export interface SignerProps { 8 | label: string 9 | name: string 10 | notEnoughFunds: boolean 11 | dangerMessage: string 12 | } 13 | 14 | export interface TxProps extends SignerProps { 15 | margin?: boolean 16 | SignerComponent: ReactElement 17 | displayFor?: DisplayFor 18 | transparent?: boolean 19 | } 20 | -------------------------------------------------------------------------------- /packages/app/src/overlay/canvas/Pool/Overview/Performance/InactiveGraph.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { PayoutLine } from 'library/Graphs/PayoutLine' 5 | 6 | export const InactiveGraph = ({ 7 | width, 8 | height, 9 | }: { 10 | width: string | number 11 | height: string | number 12 | }) => 13 | -------------------------------------------------------------------------------- /packages/app/src/overlay/canvas/PoolMembers/Lists/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface MembersListProps { 5 | pagination: boolean 6 | itemsPerPage: number 7 | memberCount: number 8 | } 9 | -------------------------------------------------------------------------------- /packages/app/src/overlay/canvas/ValidatorMetrics/EraPoints/InactiveGraph.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { EraPointsLine } from 'library/Graphs/EraPointsLine' 5 | 6 | export const InactiveGraph = ({ 7 | width, 8 | height, 9 | }: { 10 | width: string | number 11 | height: string | number 12 | }) => ( 13 | 14 | ) 15 | -------------------------------------------------------------------------------- /packages/app/src/overlay/canvas/ValidatorMetrics/Rewards/InactiveGraph.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { PayoutLine } from 'library/Graphs/PayoutLine' 5 | 6 | export const InactiveGraph = ({ 7 | width, 8 | height, 9 | }: { 10 | width: string | number 11 | height: string | number 12 | }) => 13 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/Accounts/Delegates/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const DelegatesWrapper = styled.div` 7 | border-left: 1px solid var(--border-primary-color); 8 | width: 100%; 9 | display: flex; 10 | flex-direction: column; 11 | padding-left: 1rem; 12 | margin: 0.65rem 0 1.25rem 0; 13 | 14 | > div { 15 | &:first-child { 16 | margin-top: 0; 17 | } 18 | &:last-child { 19 | margin-bottom: 0; 20 | } 21 | } 22 | ` 23 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/Bio/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | display: flex; 8 | flex-flow: column wrap; 9 | padding: 0.5rem; 10 | 11 | h2 { 12 | color: var(--text-color-primary); 13 | margin-top: 0.5rem; 14 | } 15 | 16 | h3 { 17 | margin-bottom: 0.5rem; 18 | } 19 | ` 20 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/Bio/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Title } from 'library/Modal/Title' 5 | import { Padding } from 'ui-core/modal' 6 | import { useOverlay } from 'ui-overlay' 7 | import { Wrapper } from './Wrapper' 8 | 9 | export const Bio = () => { 10 | const { name, bio } = useOverlay().modal.config.options 11 | 12 | return ( 13 | <> 14 | 15 | <Padding> 16 | <Wrapper>{bio !== undefined && <h4>{bio}</h4>}</Wrapper> 17 | </Padding> 18 | </> 19 | ) 20 | } 21 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/ChangePoolRoles/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface RoleChangeProps { 5 | roleName: string 6 | oldAddress: string 7 | newAddress: string 8 | } 9 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/ClaimPayouts/Utils.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import BigNumber from 'bignumber.js' 5 | import type { ValidatorUnclaimedReward } from 'plugin-staking-api/types' 6 | 7 | export const getTotalPayout = ( 8 | validators: ValidatorUnclaimedReward[] 9 | ): BigNumber => 10 | validators.reduce( 11 | (acc: BigNumber, { reward }: ValidatorUnclaimedReward) => acc.plus(reward), 12 | new BigNumber(0) 13 | ) 14 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/Invite/Wrapper.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const Wrapper = styled.div` 7 | padding: 0 1.75rem 1rem 1.75rem; 8 | width: 100%; 9 | display: flex; 10 | flex-direction: column; 11 | align-items: center; 12 | 13 | > .icon { 14 | width: 100%; 15 | height: auto; 16 | max-width: 7rem; 17 | margin-bottom: 3rem; 18 | } 19 | ` 20 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/ManagePool/Forms/LeavePool/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { LeavePool as LeavePoolModal } from 'overlay/modals/LeavePool' 5 | import { type Dispatch, type SetStateAction } from 'react' 6 | 7 | export const LeavePool = ({ 8 | setSection, 9 | onResize, 10 | }: { 11 | setSection: Dispatch<SetStateAction<number>> 12 | onResize: () => void 13 | }) => <LeavePoolModal onResize={onResize} onClick={() => setSection(0)} /> 14 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/ManagePool/Forms/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Dispatch, SetStateAction } from 'react' 5 | 6 | export interface ChangeRateInput { 7 | years: number 8 | months: number 9 | days: number 10 | hours: number 11 | minutes: number 12 | } 13 | 14 | export interface FormsProps { 15 | setSection: Dispatch<SetStateAction<number>> 16 | task?: string 17 | section: number 18 | incrementCalculateHeight: () => void 19 | onResize: () => void 20 | } 21 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/ManagePool/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Dispatch, SetStateAction } from 'react' 5 | 6 | export interface TasksProps { 7 | setSection: Dispatch<SetStateAction<number>> 8 | setTask: Dispatch<SetStateAction<string | undefined>> 9 | } 10 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/Networks/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface NetworkButtonProps { 5 | connected?: boolean 6 | } 7 | -------------------------------------------------------------------------------- /packages/app/src/overlay/modals/UnlockChunks/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { UnlockChunk } from 'contexts/Balances/types' 5 | import type { BondFor } from 'types' 6 | 7 | export interface FormsProps { 8 | setSection: (section: number) => void 9 | unlock: UnlockChunk | null 10 | task: string | null 11 | incrementCalculateHeight: () => void 12 | onResize: () => void 13 | } 14 | 15 | export interface ChunkProps { 16 | chunk: UnlockChunk 17 | bondFor: BondFor 18 | onRebond: (chunk: UnlockChunk) => void 19 | } 20 | -------------------------------------------------------------------------------- /packages/app/src/pages/Nominate/Active/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type BigNumber from 'bignumber.js' 5 | 6 | export interface BondedChartProps { 7 | active: BigNumber 8 | free: BigNumber 9 | unlocking: BigNumber 10 | unlocked: BigNumber 11 | inactive: boolean 12 | } 13 | 14 | export interface NewNominatorProps { 15 | syncing: boolean 16 | } 17 | -------------------------------------------------------------------------------- /packages/app/src/pages/Nominate/NominationGeo/Wrappers.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import styled from 'styled-components' 5 | 6 | export const GraphsWrapper = styled.div` 7 | margin-top: 0.5rem; 8 | display: flex; 9 | justify-content: space-evenly; 10 | flex-wrap: wrap; 11 | ` 12 | -------------------------------------------------------------------------------- /packages/app/src/pages/Overview/QuickActions/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type QuickActionGroup = 'disconnected' | 'notStaking' | 'staking' 5 | -------------------------------------------------------------------------------- /packages/app/src/pages/Pools/Status/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface StatusProps { 5 | height: number 6 | } 7 | 8 | export interface MembershipStatusProps { 9 | showButtons?: boolean 10 | buttonType?: string 11 | } 12 | 13 | export interface NewMemberProps { 14 | syncing: boolean 15 | } 16 | -------------------------------------------------------------------------------- /packages/app/src/pages/Pools/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ListFormat } from 'contexts/List/types' 5 | import type { ActivePool } from 'types' 6 | 7 | export interface PoolAccountProps { 8 | address: string | null 9 | pool: ActivePool | undefined 10 | } 11 | 12 | export interface PoolsTabsContextInterface { 13 | setActiveTab: (t: number) => void 14 | activeTab: number 15 | } 16 | 17 | export interface PayoutListContextInterface { 18 | setListFormat: (v: ListFormat) => void 19 | listFormat: ListFormat 20 | } 21 | -------------------------------------------------------------------------------- /packages/app/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | /// <reference types="vite/client" /> 5 | /// <reference types="vite-plugin-svgr/client" /> 6 | -------------------------------------------------------------------------------- /packages/app/tsconfig.node.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "composite": true, 4 | "module": "ESNext", 5 | "moduleResolution": "Node", 6 | "allowSyntheticDefaultImports": true 7 | }, 8 | "include": ["vite.config.ts"] 9 | } 10 | -------------------------------------------------------------------------------- /packages/assets/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "assets", 3 | "version": "1.2.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build dist" 8 | }, 9 | "exports": { 10 | ".": "./src/index.ts", 11 | "./*": "./src/*" 12 | }, 13 | "dependencies": { 14 | "react": "^19.1.0" 15 | }, 16 | "devDependencies": { 17 | "types": "workspace:*", 18 | "vite": "^6.3.5", 19 | "vite-plugin-svgr": "^4.3.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/assets/src/brands/vault.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%" viewBox="0 0 264.66 264.66"><path d="M217.09,132.33a84.76,84.76,0,1,1-84.76-84.76A84.76,84.76,0,0,1,217.09,132.33Z" fill="none"/><path d="M264.66,132.33A132.33,132.33,0,1,1,132.33,0,132.33,132.33,0,0,1,264.66,132.33ZM132.33,47.57a84.76,84.76,0,1,0,84.76,84.76A84.76,84.76,0,0,0,132.33,47.57Zm-28.24,66A27.75,27.75,0,1,0,131.84,85.8,27.74,27.74,0,0,0,104.09,113.55Zm27.82,14.54h0a11.17,11.17,0,0,0-11.16,11.17v31.6A11.17,11.17,0,0,0,131.91,182h0a11.17,11.17,0,0,0,11.17-11.17v-31.6A11.17,11.17,0,0,0,131.91,128.09Z" /></svg> -------------------------------------------------------------------------------- /packages/assets/src/chains/westendInline.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 766 506"><defs></defs><g id="Layer_2" data-name="Layer 2"><g id="Layer_1-2" data-name="Layer 1"><path className="primary" d="M130.66,506H301.83L356.4,308.12c7.52-27.29,45.89-27.27,53.39,0L464.17,506H635L766,0H605.61l-41,200.81c-5.95,29.16-47,30-54,1.06L461.23,0H304.77L256.66,203.13c-6.86,29-48,28.44-54.06-.74l-14.44-69.25C172,55.55,104.1,0,25.48,0H0Z"/></g></g></svg> -------------------------------------------------------------------------------- /packages/assets/src/icons/book.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path class="primary" d="M0 32C0 14.3 14.3 0 32 0h64c17.7 0 32 14.3 32 32v64H0V32zm0 96h128v256H0V128zm0 288h128v64c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32v-64zM160 32c0-17.7 14.3-32 32-32h64c17.7 0 32 14.3 32 32v64H160V32zm0 96h128v256H160V128zm0 288h128v64c0 17.7-14.3 32-32 32h-64c-17.7 0-32-14.3-32-32v-64zm203.6-19.9L320 232.6v-89.9l100.4-26.9 66 247.4-122.8 32.9zM412.2 85L320 109.6V11l36.9-9.9c16.9-4.6 34.4 5.5 38.9 22.6L412.2 85zm-40.4 342l122.8-32.9 16.3 61.1c4.5 17-5.5 34.5-22.5 39.1L427 510.8c-16.9 4.6-34.4-5.5-38.9-22.6L371.8 427z"/></svg> -------------------------------------------------------------------------------- /packages/assets/src/icons/cloud.svg: -------------------------------------------------------------------------------- 1 | <svg viewBox="0 0 29 29" fill="#fff" xmlns="http://www.w3.org/2000/svg" ><path fill-rule="evenodd" clip-rule="evenodd" d="M9.063 23.244h13.399c.036.003.072.006.11.006 1.297 0 2.932-.31 4.136-1.514a5.241 5.241 0 00-2.348-8.768c.18-1.755.2-3.885-1.096-5.74-2.43-3.479-7.258-4.252-10.771-1.798-.686.479-1.405 1.218-1.975 2.018a7.395 7.395 0 00-.92 1.69 7.063 7.063 0 10-.535 14.106z" class="accent" stroke="none"/></svg> -------------------------------------------------------------------------------- /packages/assets/src/icons/envelope.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path class="primary" d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4l217.6 163.2c11.4 8.5 27 8.5 38.4 0l217.6-163.2c12.1-9.1 19.2-23.3 19.2-38.4 0-26.5-21.5-48-48-48H48zM0 176v208c0 35.3 28.7 64 64 64h384c35.3 0 64-28.7 64-64V176L294.4 339.2a63.9 63.9 0 01-76.8 0L0 176z"/></svg> -------------------------------------------------------------------------------- /packages/assets/src/icons/moon.svg: -------------------------------------------------------------------------------- 1 | <svg xmlns="http://www.w3.org/2000/svg" class="ionicon" viewBox="0 0 512 512"><title>Moon -------------------------------------------------------------------------------- /packages/assets/src/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ChainIcons, NetworkId } from 'types' 5 | import { chainIcons } from './chains' 6 | 7 | // Get chain icons as a record of React components 8 | export const getChainIcons = (name: NetworkId): ChainIcons => chainIcons[name] 9 | -------------------------------------------------------------------------------- /packages/assets/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | /// 5 | -------------------------------------------------------------------------------- /packages/assets/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.base.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/assets/vite.config.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { defineConfig } from 'vite' 5 | import svgr from 'vite-plugin-svgr' 6 | 7 | export default defineConfig({ 8 | plugins: [svgr()], 9 | }) 10 | -------------------------------------------------------------------------------- /packages/consts/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "consts", 3 | "version": "1.2.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "exports": { 7 | ".": "./src/index.ts", 8 | "./*": "./src/*.ts" 9 | }, 10 | "scripts": { 11 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 12 | }, 13 | "dependencies": { 14 | "@substrate/connect-known-chains": "^1.10.2", 15 | "assets": "workspace:*" 16 | }, 17 | "devDependencies": { 18 | "types": "workspace:*", 19 | "vite": "^6.3.5" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/consts/src/plugins.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { Plugin } from 'types' 5 | 6 | // Force plugins to be enabled in production environment 7 | // 8 | // NOTE: If you are forking the staking dashboard and do not wish to enforce a plugin in production, 9 | // you can remove it from this list 10 | export const CompulsoryPluginsProduction: Plugin[] = ['staking_api'] 11 | 12 | export const PluginsList: Plugin[] = ['staking_api', 'subscan', 'polkawatch'] 13 | -------------------------------------------------------------------------------- /packages/consts/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "compilerOptions": { 4 | "target": "ESNext", 5 | "useDefineForClassFields": true, 6 | "lib": ["DOM", "DOM.Iterable", "ESNext"], 7 | "module": "ESNext", 8 | "skipLibCheck": true, 9 | "moduleResolution": "Bundler", 10 | "allowSyntheticDefaultImports": true, 11 | "allowImportingTsExtensions": true, 12 | "allowJs": false, 13 | "esModuleInterop": false, 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "types": ["vite/client"] 18 | }, 19 | "include": ["src"] 20 | } 21 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/erasValidatorRewardMulti.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const erasValidatorRewardMulti = async ( 8 | api: DedotClient, 9 | eras: number[] 10 | ) => await api.query.staking.erasValidatorReward.multi(eras) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/poolMembersMulti.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const poolMembersMulti = async ( 8 | api: DedotClient, 9 | addresses: string[] 10 | ) => await api.query.nominationPools.poolMembers.multi(addresses) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/poolMetadataMulti.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const poolMetadataMulti = async ( 8 | api: DedotClient, 9 | ids: number[] 10 | ) => await api.query.nominationPools.metadata.multi(ids) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/proxies.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const proxies = async ( 8 | api: DedotClient, 9 | address: string 10 | ) => { 11 | const [result] = await api.query.proxy.proxies(address) 12 | 13 | // NOTE: Only returning the delegate accounts of any returned proxies 14 | return result.map((r) => r.delegate.address(api.consts.system.ss58Prefix)) 15 | } 16 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/sessionValidators.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const sessionValidators = async ( 8 | api: DedotClient 9 | ) => { 10 | const result = await api.query.session.validators() 11 | return result.map((address) => address.address(api.consts.system.ss58Prefix)) 12 | } 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/query/validatorsMulti.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const validatorsMulti = async ( 8 | api: DedotClient, 9 | addresses: string[] 10 | ) => await api.query.staking.validators.multi(addresses) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/runtimeApi/balanceToPoints.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const balanceToPoints = async ( 8 | api: DedotClient, 9 | poolId: number, 10 | amount: bigint 11 | ) => await api.call.nominationPoolsApi.balanceToPoints(poolId, amount) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/runtimeApi/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { balanceToPoints } from './balanceToPoints' 5 | import { pendingRewards } from './pendingRewards' 6 | import { pointsToBalance } from './pointsToBalance' 7 | 8 | export const runtimeApi = { 9 | balanceToPoints, 10 | pendingRewards, 11 | pointsToBalance, 12 | } 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/runtimeApi/pendingRewards.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const pendingRewards = async ( 8 | api: DedotClient, 9 | address: string 10 | ) => await api.call.nominationPoolsApi.pendingRewards(address) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/runtimeApi/pointsToBalance.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | 7 | export const pointsToBalance = async ( 8 | api: DedotClient, 9 | poolId: number, 10 | points: bigint 11 | ) => await api.call.nominationPoolsApi.pointsToBalance(poolId, points) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/services/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { KusamaService } from './kusama' 5 | import { PolkadotService } from './polkadot' 6 | import { WestendService } from './westend' 7 | 8 | export const Services = { 9 | polkadot: PolkadotService, 10 | kusama: KusamaService, 11 | westend: WestendService, 12 | } 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/smoldot/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ClientOptionsWithBytecode } from 'smoldot' 5 | 6 | export type WorkerOpts = Omit< 7 | ClientOptionsWithBytecode, 8 | 'bytecode' | 'portToWorker' 9 | > 10 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/batch.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient, SubmittableExtrinsic } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const batch = ( 9 | api: DedotClient, 10 | calls: SubmittableExtrinsic[] 11 | ): SubmittableExtrinsic => { 12 | // @ts-expect-error Batch calls are too complex for type inference 13 | const tx = asTx(api.tx.utility.batch(calls.map((call) => call.call))) 14 | return tx 15 | } 16 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/fastUnstakeDeregister.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const fastUnstakeDeregister = ( 9 | api: DedotClient 10 | ) => asTx(api.tx.fastUnstake.deregister()) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/fastUnstakeRegister.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const fastUnstakeRegister = ( 9 | api: DedotClient 10 | ) => asTx(api.tx.fastUnstake.registerFastUnstake()) 11 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/newNominator.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { PalletStakingRewardDestination } from 'dedot/chaintypes' 6 | import type { StakingChain } from '../types' 7 | import { asTxs } from '../util' 8 | 9 | export const newNominator = ( 10 | api: DedotClient, 11 | bond: bigint, 12 | payee: PalletStakingRewardDestination, 13 | nominees: string[] 14 | ) => 15 | asTxs([api.tx.staking.bond(bond, payee), api.tx.staking.nominate(nominees)]) 16 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/payoutStakersByPage.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const payoutStakersByPage = ( 9 | api: DedotClient, 10 | validator: string, 11 | era: number, 12 | page: number 13 | ) => asTx(api.tx.staking.payoutStakersByPage(validator, era, page)) 14 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolChill.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolChill = ( 9 | api: DedotClient, 10 | poolId: number 11 | ) => asTx(api.tx.nominationPools.chill(poolId)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolClaimCommission.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolClaimCommission = ( 9 | api: DedotClient, 10 | poolId: number 11 | ) => asTx(api.tx.nominationPools.claimCommission(poolId)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolClaimPayout.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolClaimPayout = (api: DedotClient) => 9 | asTx(api.tx.nominationPools.claimPayout()) 10 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolNominate.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolNominate = ( 9 | api: DedotClient, 10 | poolId: number, 11 | nominees: string[] 12 | ) => asTx(api.tx.nominationPools.nominate(poolId, nominees)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetClaimPermission.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { ClaimPermission } from 'types' 6 | import type { StakingChain } from '../types' 7 | import { asTx } from '../util' 8 | 9 | export const poolSetClaimPermission = ( 10 | api: DedotClient, 11 | claimPermission: ClaimPermission 12 | ) => asTx(api.tx.nominationPools.setClaimPermission(claimPermission)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetCommission.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolSetCommission = ( 9 | api: DedotClient, 10 | poolId: number, 11 | commission?: [number, string] 12 | ) => asTx(api.tx.nominationPools.setCommission(poolId, commission)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetCommissionChangeRate.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolSetCommissionChangeRate = ( 9 | api: DedotClient, 10 | poolId: number, 11 | maxIncrease: number, 12 | minDelay: number 13 | ) => 14 | asTx( 15 | api.tx.nominationPools.setCommissionChangeRate(poolId, { 16 | maxIncrease, 17 | minDelay, 18 | }) 19 | ) 20 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetCommissionMax.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolSetCommissionMax = ( 9 | api: DedotClient, 10 | poolId: number, 11 | max: number 12 | ) => asTx(api.tx.nominationPools.setCommissionMax(poolId, max)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetMetadata.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { BytesLike } from 'dedot/codecs' 6 | import type { StakingChain } from '../types' 7 | import { asTx } from '../util' 8 | 9 | export const poolSetMetadata = ( 10 | api: DedotClient, 11 | poolId: number, 12 | metadata: BytesLike 13 | ) => asTx(api.tx.nominationPools.setMetadata(poolId, metadata)) 14 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolSetState.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { PalletNominationPoolsPoolState } from 'dedot/chaintypes' 6 | import type { StakingChain } from '../types' 7 | import { asTx } from '../util' 8 | 9 | export const poolSetState = ( 10 | api: DedotClient, 11 | poolId: number, 12 | state: PalletNominationPoolsPoolState 13 | ) => asTx(api.tx.nominationPools.setState(poolId, state)) 14 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolUnbond.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolUnbond = ( 9 | api: DedotClient, 10 | who: string, 11 | points: bigint 12 | ) => asTx(api.tx.nominationPools.unbond(who, points)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/poolWithdraw.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const poolWithdraw = ( 9 | api: DedotClient, 10 | who: string, 11 | numSlashingSpans: number 12 | ) => asTx(api.tx.nominationPools.withdrawUnbonded(who, numSlashingSpans)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/proxy.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient, SubmittableExtrinsic } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const proxy = ( 9 | api: DedotClient, 10 | real: string, 11 | call: SubmittableExtrinsic 12 | ): SubmittableExtrinsic => { 13 | // @ts-expect-error Proxy type too complex to determine 14 | const tx = asTx(api.tx.proxy.proxy(real, undefined, call.call)) 15 | return tx 16 | } 17 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/setController.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const setController = (api: DedotClient) => 9 | asTx(api.tx.staking.setController()) 10 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingBondExtra.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingBondExtra = ( 9 | api: DedotClient, 10 | bond: bigint 11 | ) => asTx(api.tx.staking.bondExtra(bond)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingChill.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingChill = (api: DedotClient) => 9 | asTx(api.tx.staking.chill()) 10 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingNominate.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingNominate = ( 9 | api: DedotClient, 10 | nominees: string[] 11 | ) => asTx(api.tx.staking.nominate(nominees)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingRebond.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingRebond = ( 9 | api: DedotClient, 10 | bond: bigint 11 | ) => asTx(api.tx.staking.rebond(bond)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingSetPayee.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { PalletStakingRewardDestination } from 'dedot/chaintypes' 6 | import type { StakingChain } from '../types' 7 | import { asTx } from '../util' 8 | 9 | export const stakingSetPayee = ( 10 | api: DedotClient, 11 | payee: PalletStakingRewardDestination 12 | ) => asTx(api.tx.staking.setPayee(payee)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingUnbond.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingUnbond = ( 9 | api: DedotClient, 10 | bond: bigint 11 | ) => asTx(api.tx.staking.unbond(bond)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/stakingWithdraw.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const stakingWithdraw = ( 9 | api: DedotClient, 10 | numSlashingSpans: number 11 | ) => asTx(api.tx.staking.withdrawUnbonded(numSlashingSpans)) 12 | -------------------------------------------------------------------------------- /packages/dedot-api/src/tx/transferKeepAlive.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { DedotClient } from 'dedot' 5 | import type { StakingChain } from '../types' 6 | import { asTx } from '../util' 7 | 8 | export const transferKeepAlive = ( 9 | api: DedotClient, 10 | to: string, 11 | value: bigint 12 | ) => asTx(api.tx.balances.transferKeepAlive(to, value)) 13 | -------------------------------------------------------------------------------- /packages/dedot-api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/global-bus/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "global-bus", 3 | "version": "0.9.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 8 | }, 9 | "exports": { 10 | ".": "./src/index.ts", 11 | "./util": "./src/util.ts" 12 | }, 13 | "dependencies": { 14 | "@w3ux/observables-connect": "^0.9.40", 15 | "@w3ux/utils": "^2.0.10", 16 | "consts": "workspace:*", 17 | "dedot": "^0.12.0", 18 | "rxjs": "^7.8.2" 19 | }, 20 | "devDependencies": { 21 | "@w3ux/types": "^2.2.3", 22 | "types": "workspace:*" 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/global-bus/src/accountBalances/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { AccountBalance } from 'types' 5 | 6 | export const defaultAccountBalance: AccountBalance = { 7 | synced: false, 8 | nonce: 0, 9 | balance: { 10 | free: 0n, 11 | reserved: 0n, 12 | frozen: 0n, 13 | }, 14 | } 15 | -------------------------------------------------------------------------------- /packages/global-bus/src/accountBalances/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { AccountBalance } from 'types' 6 | 7 | type Chain = string 8 | type Address = string 9 | type State = Record> 10 | 11 | export const _accountBalances = new BehaviorSubject({}) 12 | -------------------------------------------------------------------------------- /packages/global-bus/src/activeAddress/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { MaybeString } from '@w3ux/types' 5 | import { _activeAddress } from './private' 6 | 7 | export const activeAddress$ = _activeAddress.asObservable() 8 | 9 | export const resetActiveAddress = () => { 10 | _activeAddress.next(null) 11 | } 12 | 13 | export const getActiveAddress = () => _activeAddress.getValue() 14 | 15 | export const setActiveAddress = (address: MaybeString) => { 16 | _activeAddress.next(address) 17 | } 18 | -------------------------------------------------------------------------------- /packages/global-bus/src/activeAddress/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { MaybeString } from '@w3ux/types' 5 | import { BehaviorSubject } from 'rxjs' 6 | 7 | export const _activeAddress = new BehaviorSubject(null) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/activeEra/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ActiveEra } from 'types' 5 | 6 | export const defaultActiveEra: ActiveEra = { 7 | index: 0, 8 | start: 0n, 9 | } 10 | -------------------------------------------------------------------------------- /packages/global-bus/src/activeEra/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ActiveEra } from 'types' 6 | import { defaultActiveEra } from './default' 7 | 8 | export const _activeEra = new BehaviorSubject(defaultActiveEra) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/activePoolIds/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | 6 | export const _activePoolIds = new BehaviorSubject([]) 7 | -------------------------------------------------------------------------------- /packages/global-bus/src/activePools/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export const defaultClaimPermission = 'PermissionlessWithdraw' 5 | -------------------------------------------------------------------------------- /packages/global-bus/src/activePools/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ActivePool } from 'types' 6 | 7 | export const _activePools = new BehaviorSubject([]) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/activeProxy/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ActiveProxy } from 'types' 6 | 7 | export const _activeProxy = new BehaviorSubject(null) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/apiStatus/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ApiStatus } from 'types' 6 | 7 | export const _apiStatus = new BehaviorSubject>({}) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/blockNumber/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { _blockNumber } from './private' 5 | 6 | export const blockNumber$ = _blockNumber.asObservable() 7 | 8 | export const resetBlockNumber = () => { 9 | _blockNumber.next(0) 10 | } 11 | 12 | export const getBlockNumber = () => _blockNumber.getValue() 13 | 14 | export const setBlockNumber = (number: number) => { 15 | _blockNumber.next(number) 16 | } 17 | -------------------------------------------------------------------------------- /packages/global-bus/src/blockNumber/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | 6 | export const _blockNumber = new BehaviorSubject(0) 7 | -------------------------------------------------------------------------------- /packages/global-bus/src/bonded/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { Bonded } from 'types' 6 | 7 | export const _bonded = new BehaviorSubject([]) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/chainSpecs/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ChainSpec } from 'types' 6 | 7 | export const _chainSpecs = new BehaviorSubject>({}) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/consts/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ChainConsts } from 'types' 5 | 6 | export const defaultConsts: ChainConsts = { 7 | bondDuration: 0, 8 | sessionsPerEra: 0, 9 | maxExposurePageSize: 0, 10 | historyDepth: 0, 11 | expectedBlockTime: 0n, 12 | epochDuration: 0n, 13 | fastUnstakeDeposit: 0n, 14 | poolsPalletId: new Uint8Array([0]), 15 | } 16 | -------------------------------------------------------------------------------- /packages/global-bus/src/consts/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ChainConsts } from 'types' 6 | 7 | export const _consts = new BehaviorSubject>({}) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/eraRewardPoints/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { EraRewardPoints } from 'types' 5 | 6 | export const defaultEraRewardPoints: EraRewardPoints = { 7 | total: 0, 8 | individual: [], 9 | } 10 | -------------------------------------------------------------------------------- /packages/global-bus/src/eraRewardPoints/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { EraRewardPoints } from 'types' 6 | import { defaultEraRewardPoints } from './default' 7 | 8 | export const _eraRewardPoints = new BehaviorSubject( 9 | defaultEraRewardPoints 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/externalAccounts/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ExternalAccount } from 'types' 6 | import { getInitialExternalAccounts } from '../util' 7 | 8 | export const _externalAccounts = new BehaviorSubject( 9 | getInitialExternalAccounts() 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/fastUnstakeConfig/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { FastUnstakeConfig } from 'types' 5 | 6 | export const defaultFastUnstakeConfig: FastUnstakeConfig = { 7 | head: { 8 | stashes: [], 9 | checked: [], 10 | }, 11 | counterForQueue: 0, 12 | } 13 | -------------------------------------------------------------------------------- /packages/global-bus/src/fastUnstakeConfig/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { FastUnstakeConfig } from 'types' 6 | import { defaultFastUnstakeConfig } from './default' 7 | 8 | export const _fastUnstakeConfig = new BehaviorSubject( 9 | defaultFastUnstakeConfig 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/fastUnstakeQueue/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { FastUnstakeQueue } from 'types' 5 | import { _fastUnstakeQueue } from './private' 6 | 7 | export const fastUnstakeQueue$ = _fastUnstakeQueue.asObservable() 8 | 9 | export const resetFastUnstakeQueue = () => { 10 | _fastUnstakeQueue.next(undefined) 11 | } 12 | 13 | export const getFastUnstakeQueue = () => _fastUnstakeQueue.getValue() 14 | 15 | export const setFastUnstakeQueue = (value: FastUnstakeQueue) => { 16 | _fastUnstakeQueue.next(value) 17 | } 18 | -------------------------------------------------------------------------------- /packages/global-bus/src/fastUnstakeQueue/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { FastUnstakeQueue } from 'types' 6 | 7 | export const _fastUnstakeQueue = new BehaviorSubject( 8 | undefined 9 | ) 10 | -------------------------------------------------------------------------------- /packages/global-bus/src/importedAccounts/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ImportedAccount } from 'types' 6 | 7 | export const _importedAccounts = new BehaviorSubject([]) 8 | -------------------------------------------------------------------------------- /packages/global-bus/src/networkConfig/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { NetworkConfig } from 'types' 6 | import { getInitialNetworkConfig } from '../util' 7 | 8 | export const _networkConfig = new BehaviorSubject( 9 | getInitialNetworkConfig() 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/poolMemberships/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { PoolMembershipState } from 'types' 5 | 6 | export const defaultPoolMembership: PoolMembershipState = { 7 | synced: false, 8 | membership: undefined, 9 | } 10 | -------------------------------------------------------------------------------- /packages/global-bus/src/poolMemberships/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { PoolMembershipState } from 'types' 6 | 7 | type State = Record 8 | export const _poolMemberships = new BehaviorSubject({}) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/poolsConfig/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { PoolsConfig } from 'types' 5 | 6 | export const defaultPoolsConfig: PoolsConfig = { 7 | counterForPoolMembers: 0, 8 | counterForBondedPools: 0, 9 | counterForRewardPools: 0, 10 | lastPoolId: 0, 11 | maxPoolMembers: undefined, 12 | maxPoolMembersPerPool: undefined, 13 | maxPools: undefined, 14 | minCreateBond: 0n, 15 | minJoinBond: 0n, 16 | globalMaxCommission: 0, 17 | } 18 | -------------------------------------------------------------------------------- /packages/global-bus/src/poolsConfig/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { PoolsConfig } from 'types' 6 | import { defaultPoolsConfig } from './default' 7 | 8 | export const _poolsConfig = new BehaviorSubject(defaultPoolsConfig) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/proxies/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { Proxies } from 'types' 6 | 7 | type State = Record 8 | export const _proxies = new BehaviorSubject({}) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/relayMetrics/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { RelayMetrics } from 'types' 5 | 6 | export const defaultRelayMetrics: RelayMetrics = { 7 | auctionCounter: 0, 8 | earliestStoredSession: 0, 9 | } 10 | -------------------------------------------------------------------------------- /packages/global-bus/src/relayMetrics/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { RelayMetrics } from 'types' 6 | import { defaultRelayMetrics } from './default' 7 | 8 | export const _relayMetrics = new BehaviorSubject( 9 | defaultRelayMetrics 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/serviceInterface/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { ServiceInterface } from 'types' 6 | import { defaultServiceInterface } from './default' 7 | 8 | export const _serviceInterface = new BehaviorSubject( 9 | defaultServiceInterface 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/stakingLedgers/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { StakingLedger } from 'types' 5 | 6 | export const defaultStakingLedger: StakingLedger = { 7 | ledger: undefined, 8 | payee: undefined, 9 | nominators: undefined, 10 | controllerUnmigrated: false, 11 | } 12 | -------------------------------------------------------------------------------- /packages/global-bus/src/stakingLedgers/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { StakingLedger } from 'types' 6 | 7 | type State = Record 8 | export const _stakingLedgers = new BehaviorSubject({}) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/stakingMetrics/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { StakingMetrics } from 'types' 5 | 6 | export const defaultStakingMetrics: StakingMetrics = { 7 | totalIssuance: 0n, 8 | erasToCheckPerBlock: 0, 9 | minimumActiveStake: 0n, 10 | counterForValidators: 0, 11 | maxValidatorsCount: undefined, 12 | validatorCount: 0, 13 | lastReward: undefined, 14 | lastTotalStake: 0n, 15 | minNominatorBond: 0n, 16 | totalStaked: 0n, 17 | counterForNominators: 0, 18 | } 19 | -------------------------------------------------------------------------------- /packages/global-bus/src/stakingMetrics/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { StakingMetrics } from 'types' 6 | import { defaultStakingMetrics } from './default' 7 | 8 | export const _stakingMetrics = new BehaviorSubject( 9 | defaultStakingMetrics 10 | ) 11 | -------------------------------------------------------------------------------- /packages/global-bus/src/syncStatus/default.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { SyncId } from 'types' 5 | 6 | export const allSyncIds: SyncId[] = [ 7 | 'initialization', 8 | 'era-stakers', 9 | 'bonded-pools', 10 | 'active-pools', 11 | 'active-proxy', 12 | ] 13 | 14 | export const defaultSyncStatus: SyncId[] = [ 15 | 'initialization', 16 | 'era-stakers', 17 | 'bonded-pools', 18 | 'active-pools', 19 | 'active-proxy', 20 | ] 21 | -------------------------------------------------------------------------------- /packages/global-bus/src/syncStatus/private.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { BehaviorSubject } from 'rxjs' 5 | import type { SyncId } from 'types' 6 | import { defaultSyncStatus } from './default' 7 | 8 | export const _syncStatus = new BehaviorSubject(defaultSyncStatus) 9 | -------------------------------------------------------------------------------- /packages/global-bus/src/util.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './externalAccounts/util' 5 | export * from './networkConfig/util' 6 | export * from './syncStatus/util' 7 | -------------------------------------------------------------------------------- /packages/global-bus/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/locales/src/util/index.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './currency' 5 | export * from './language' 6 | -------------------------------------------------------------------------------- /packages/locales/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "compilerOptions": { 4 | "types": ["vite/client"] 5 | }, 6 | "include": ["src"] 7 | } 8 | -------------------------------------------------------------------------------- /packages/plugin-staking-api/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "plugin-staking-api", 3 | "version": "1.2.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 8 | }, 9 | "exports": { 10 | ".": "./src/index.tsx", 11 | "./types": "./src/types.ts" 12 | }, 13 | "dependencies": { 14 | "@apollo/client": "^3.13.8", 15 | "graphql": "^16.11.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/plugin-staking-api/src/Client.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { ApolloClient, InMemoryCache } from '@apollo/client' 5 | 6 | const STAKING_API_ENDPOINT = 'https://api.staking.polkadot.cloud' 7 | 8 | const client = new ApolloClient({ 9 | uri: STAKING_API_ENDPOINT, 10 | cache: new InMemoryCache(), 11 | }) 12 | 13 | export { client } 14 | -------------------------------------------------------------------------------- /packages/plugin-staking-api/src/util.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { NominatorReward, PoolReward } from './types' 5 | 6 | export const isPoolReward = ( 7 | p: PoolReward | NominatorReward 8 | ): p is PoolReward => 'poolId' in p 9 | 10 | export const isNominatorReward = ( 11 | p: PoolReward | NominatorReward 12 | ): p is NominatorReward => !isPoolReward(p) 13 | -------------------------------------------------------------------------------- /packages/plugin-staking-api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/rpc-config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rpc-config", 3 | "version": "0.9.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build tsconfig.tsbuildinfo dist", 8 | "compile": "tsup" 9 | }, 10 | "dependencies": { 11 | "consts": "workspace:*" 12 | }, 13 | "devDependencies": { 14 | "@types/node": "^22.15.19", 15 | "fs": "0.0.1-security", 16 | "path": "^0.12.7", 17 | "url": "^0.11.4", 18 | "tsup": "^8.5.0" 19 | } 20 | } -------------------------------------------------------------------------------- /packages/rpc-config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "compilerOptions": { 4 | "types": ["node"] 5 | }, 6 | "include": ["src", "../../env.d.ts"] 7 | } 8 | -------------------------------------------------------------------------------- /packages/rpc-config/tsup.config.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { defineConfig } from 'tsup' 5 | 6 | export default defineConfig({ 7 | entry: ['src/check-rpc.ts'], 8 | outDir: 'dist', 9 | format: ['esm'], 10 | platform: 'node', 11 | bundle: true, 12 | clean: true, 13 | noExternal: ['consts'], 14 | }) 15 | -------------------------------------------------------------------------------- /packages/styles/fonts/Inter500.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Inter500.woff2 -------------------------------------------------------------------------------- /packages/styles/fonts/Inter600.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Inter600.woff2 -------------------------------------------------------------------------------- /packages/styles/fonts/Inter700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Inter700.woff2 -------------------------------------------------------------------------------- /packages/styles/fonts/Inter800.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Inter800.woff2 -------------------------------------------------------------------------------- /packages/styles/fonts/Inter900.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Inter900.woff2 -------------------------------------------------------------------------------- /packages/styles/fonts/Poppins700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/polkadot-cloud/polkadot-staking-dashboard/a37be879358dbbf6db7853e8565ff88b2d72a754/packages/styles/fonts/Poppins700.woff2 -------------------------------------------------------------------------------- /packages/styles/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "styles", 3 | "version": "1.2.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "main": "src/", 7 | "scripts": { 8 | "clear": "rm -rf build dist" 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/styles/theme/_variables.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | $max-page-width-lg: 1450px; 5 | $max-page-width-sm: 1100px; 6 | $page-width-medium-threshold: 1150px; 7 | $page-width-small-threshold: 826px; 8 | $row-section-thirds-threshold: 1400px; 9 | $side-menu-maximised-width: 145px; 10 | $side-menu-minimised-width: 75px; 11 | $side-menu-hidden-width: 195px; 12 | -------------------------------------------------------------------------------- /packages/types/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "types", 3 | "version": "1.2.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "exports": { 7 | ".": "./src/index.ts" 8 | }, 9 | "scripts": { 10 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 11 | }, 12 | "dependencies": { 13 | "dedot": "^0.12.0" 14 | }, 15 | "devDependencies": { 16 | "@dedot/chaintypes": "^0.113.0", 17 | "bignumber.js": "^9.3.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/types/src/balances.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface AccountBalance { 5 | synced: boolean 6 | nonce: number 7 | balance: { 8 | free: bigint 9 | reserved: bigint 10 | frozen: bigint 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/types/src/common.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 5 | export type AnyJson = any 6 | 7 | // eslint-disable-next-line @typescript-eslint/no-explicit-any 8 | export type AnyFunction = any 9 | -------------------------------------------------------------------------------- /packages/types/src/fastUnstake.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { AccountId32 } from 'dedot/codecs' 5 | 6 | export interface FastUnstakeConfig { 7 | head: FastUnstakeHead 8 | counterForQueue: number 9 | } 10 | 11 | export interface FastUnstakeHead { 12 | stashes: [AccountId32, bigint][] 13 | checked: number[] 14 | } 15 | 16 | export type FastUnstakeQueue = 17 | | { 18 | address: string 19 | queue: bigint 20 | } 21 | | undefined 22 | -------------------------------------------------------------------------------- /packages/types/src/nominate.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type BondFor = 'pool' | 'nominator' 5 | 6 | export interface Nominations { 7 | targets: string[] 8 | submittedIn: number 9 | } 10 | 11 | export type NominationStatus = 'active' | 'inactive' | 'waiting' 12 | 13 | export type Nominator = Nominations & { 14 | suppressed: boolean 15 | } 16 | 17 | export type NominatorsMultiQuery = (Nominator | undefined)[] 18 | -------------------------------------------------------------------------------- /packages/types/src/plugins.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | // Available plugin keys 5 | export type Plugin = 'staking_api' | 'subscan' | 'polkawatch' 6 | -------------------------------------------------------------------------------- /packages/types/src/syncing.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type SyncId = 5 | | 'initialization' 6 | | 'era-stakers' 7 | | 'bonded-pools' 8 | | 'active-pools' 9 | | 'active-proxy' 10 | 11 | export type SyncStatus = 'syncing' | 'complete' 12 | 13 | export type SyncConfig = '*' | SyncId[] 14 | -------------------------------------------------------------------------------- /packages/types/src/validators.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export type ValidatorStatus = 'waiting' | 'active' 5 | 6 | export interface Validator { 7 | address: string 8 | prefs: ValidatorPrefs 9 | } 10 | 11 | export interface ValidatorPrefs { 12 | commission: number 13 | blocked: boolean 14 | } 15 | 16 | export interface NominationSelection { 17 | nominations: Validator[] 18 | } 19 | -------------------------------------------------------------------------------- /packages/types/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonAccount/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Label } from './Label' 5 | import { Standalone } from './Standalone' 6 | 7 | export const ButtonAccount = { 8 | Standalone, 9 | Label, 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonMono/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnMono { 5 | background: var(--text-color-primary); 6 | border: 1px solid var(--text-color-primary); 7 | border-radius: var(--button-lg-border-radius); 8 | color: var(--text-color-invert); 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonMonoInvert/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnMonoInvert { 5 | border: 1px solid var(--text-color-primary); 6 | border-radius: var(--button-lg-border-radius); 7 | color: var(--text-color-primary); 8 | } 9 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonPrimary/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnPrimary { 5 | background: var(--accent-color-primary); 6 | border: 1px solid var(--accent-color-primary); 7 | border-radius: var(--button-lg-border-radius); 8 | color: white; 9 | transition: transform 0.15s; 10 | } 11 | 12 | .btnPrimarySecondaryColor { 13 | background: var(--accent-color-secondary); 14 | border: 1px solid var(--accent-color-secondary); 15 | } 16 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonPrimaryInvert/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnPrimaryInvert { 5 | border: 1px solid var(--accent-color-primary); 6 | border-radius: var(--button-lg-border-radius); 7 | color: var(--accent-color-primary); 8 | 9 | &.secondary { 10 | border: 1px solid var(--accent-color-secondary); 11 | color: var(--accent-color-secondary); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonSecondary/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnSecondary { 5 | background: var(--button-secondary-background); 6 | border: 1px solid var(--button-secondary-background); 7 | border-radius: var(--button-lg-border-radius); 8 | color: var(--text-color-primary); 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonSubmitInvert/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnSubmitInvert { 5 | border: 1px solid var(--accent-color-primary); 6 | border-radius: var(--button-sm-border-radius); 7 | color: var(--accent-color-primary); 8 | } 9 | 10 | .btnSubmitInvertSm { 11 | padding: var(--button-lg-padding); 12 | font-size: var(--button-sm-font-size); 13 | } 14 | 15 | .btnSubmitInvertLg { 16 | padding: var(--button-lg-padding); 17 | font-size: var(--button-lg-font-size); 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/ButtonTertiary/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .btnTertiary { 5 | border: 1px solid var(--button-secondary-background); 6 | border-radius: var(--button-lg-border-radius); 7 | color: var(--text-color-secondary); 8 | } 9 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/MultiButton/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Button } from './Button' 5 | import { Container } from './Container' 6 | 7 | export const MultiButton = { 8 | Container, 9 | Button, 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/PopoverTab/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Button } from './Button' 5 | import { Container } from './Container' 6 | 7 | export const PopoverTab = { 8 | Button, 9 | Container, 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/QuickAction/Container/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .container { 5 | display: flex; 6 | justify-content: space-between; 7 | flex-flow: row nowrap; 8 | flex-grow: 1; 9 | 10 | @media (max-width: 950px) { 11 | flex-wrap: wrap; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/QuickAction/Container/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Container = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-buttons/src/QuickAction/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Button, PreloadingButton } from './Button' 5 | import { Container } from './Container' 6 | 7 | export const QuickAction = { 8 | Button, 9 | Container, 10 | PreloadingButton, 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-buttons/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src", "../../env.d.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/Empty/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .empty { 5 | width: 100%; 6 | display: flex; 7 | justify-content: center; 8 | padding: 1.5rem 0 1.5rem 0; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/Empty/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Empty = ({ style, children }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/Inactive/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .inactive { 5 | cursor: default; 6 | position: absolute; 7 | top: 0; 8 | left: 0; 9 | width: 100%; 10 | height: 100%; 11 | z-index: 8; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/Inactive/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Inactive = ({ style }: ComponentBase) => ( 8 |
9 | ) 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/SubHeading/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .subHeading { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | color: var(--text-color-secondary); 7 | font-family: Inter, sans-serif; 8 | padding: 0.6rem 0.75rem; 9 | padding-top: 0; 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/SubHeading/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const SubHeading = ({ 8 | text, 9 | style, 10 | }: ComponentBase & { 11 | text: string 12 | }) => ( 13 |

14 | {text} 15 |

16 | ) 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Empty } from './Empty' 5 | import { Header } from './Header' 6 | import { Inactive } from './Inactive' 7 | import { Item } from './Item' 8 | import { SubHeading } from './SubHeading' 9 | 10 | export const AccountImport = { 11 | Inactive, 12 | Empty, 13 | Header, 14 | Item, 15 | SubHeading, 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/AccountImport/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import type { ComponentBase } from 'types' 6 | 7 | export type ItemProps = ComponentBase & { 8 | address: string 9 | initial: string 10 | disableEditIfImported?: boolean 11 | allowAction?: boolean 12 | Identicon: ReactNode 13 | renameHandler: (address: string, newName: string) => void 14 | existsHandler: (address: string) => boolean 15 | onRemove: (address: string) => void 16 | last?: boolean 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/ButtonRow/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .buttonRow { 5 | display: flex; 6 | align-items: center; 7 | 8 | &.yMargin { 9 | margin-top: 1rem; 10 | } 11 | &.xMargin { 12 | margin-left: 0.25rem; 13 | margin-right: 0.25rem; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/CardLabel/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .cardLabel { 5 | color: var(--text-color-secondary); 6 | font-family: InterSemiBold, sans-serif; 7 | margin-top: 0.2rem; 8 | margin-left: 0.4rem; 9 | font-size: 1.1rem; 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/CardLabel/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const CardLabel = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Countdown/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .countdown { 5 | color: var(--text-color-primary); 6 | font-family: InterBold, sans-serif; 7 | display: flex; 8 | font-size: 1.2rem; 9 | 10 | span { 11 | color: var(--text-color-primary); 12 | font-family: InterSemiBold, sans-serif; 13 | font-size: 0.95rem; 14 | margin-left: 0.3rem; 15 | margin-top: 0.1rem; 16 | margin-right: 0.75rem; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Countdown/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Countdown = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Identity/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .identity { 5 | padding: 0.5rem; 6 | display: flex; 7 | align-items: center; 8 | 9 | > span { 10 | margin-right: 0.75rem; 11 | font-size: 3rem; 12 | } 13 | 14 | > div > h4 { 15 | margin-top: 0.4rem; 16 | display: flex; 17 | align-items: center; 18 | 19 | > span { 20 | color: var(--text-color-primary); 21 | margin-left: 0.4rem; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Offline/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Offline = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Body/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .body { 5 | position: relative; 6 | display: flex; 7 | flex-grow: 1; 8 | } 9 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Body/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | /** 8 | * @name Body 9 | * @summary An element that houses Side and Main. 10 | */ 11 | export const Body = ({ children, style }: ComponentBase) => ( 12 |
13 | {children} 14 |
15 | ) 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Container/index.module.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | @import 'styles/theme/_variables'; 5 | 6 | .container { 7 | display: flex; 8 | flex-direction: column; 9 | padding-bottom: 0.75rem; 10 | width: 100%; 11 | margin: 0 auto; 12 | 13 | @media (min-width: $page-width-medium-threshold) { 14 | order: 0; 15 | flex: 1; 16 | flex-basis: 100%; 17 | width: 100%; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Entry/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .entry { 5 | background: var(--gradient-background); 6 | background-attachment: fixed; 7 | display: flex; 8 | flex-direction: column; 9 | flex-grow: 1; 10 | width: 100%; 11 | min-height: 100vh; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Footer/index.module.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | .footer { 5 | display: flex; 6 | flex-direction: column; 7 | position: absolute; 8 | bottom: 0; 9 | left: 0; 10 | width: 100%; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Footer/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | /** 8 | * @name Footer 9 | * @summary Footer container. 10 | */ 11 | export const Footer = ({ children, style }: ComponentBase) => ( 12 |
13 | {children} 14 |
15 | ) 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Heading/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .heading { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | display: flex; 7 | align-items: center; 8 | flex-flow: row wrap; 9 | padding-bottom: 0.75rem; 10 | padding-top: 0.75rem; 11 | margin-bottom: 0.25rem; 12 | width: 100%; 13 | 14 | > span { 15 | margin-right: 1rem; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Heading/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | /** 8 | * @name Heading 9 | * @summary Page heading container. 10 | */ 11 | export const Heading = ({ children, style }: ComponentBase) => ( 12 |
13 | {children} 14 |
15 | ) 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Main/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .main { 5 | position: relative; 6 | display: flex; 7 | flex-direction: column; 8 | max-width: 100%; 9 | flex: 1; 10 | padding-bottom: 4.1rem; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Row/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .row { 5 | display: flex; 6 | flex-shrink: 0; 7 | flex-flow: row wrap; 8 | width: 100%; 9 | margin: 0; 10 | } 11 | 12 | .yMargin { 13 | margin: 1rem 0; 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Page/Side/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | 6 | export type SideProps = ComponentBase & { 7 | open: boolean 8 | minimised: boolean 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Cell/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .cell { 5 | > h3, 6 | h4 { 7 | display: flex; 8 | align-items: center; 9 | } 10 | > h4 > svg { 11 | margin-right: 0.5rem; 12 | width: 1.5rem; 13 | } 14 | > h3 { 15 | font-family: Inter, sans-serif; 16 | svg { 17 | color: var(--status-success-color); 18 | margin-right: 0.6rem; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Cell/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Cell = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Cells/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import type { ComponentBase } from 'types' 6 | import { Cell } from '../Cell' 7 | 8 | export const Cells = ({ 9 | items, 10 | }: ComponentBase & { 11 | items: React.ReactNode[] 12 | }): ReactNode => items.map((item, i) => {item}) 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Head/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .head { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | grid-template-columns: repeat(3, 1fr); 7 | display: grid; 8 | > div > h4 { 9 | color: var(--text-color-tertiary); 10 | font-family: InterSemiBold, sans-serif; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Head/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { ComponentBase } from 'types' 6 | import commonClasses from '../common.module.scss' 7 | import classes from './index.module.scss' 8 | 9 | export const Head = ({ children, style }: ComponentBase) => { 10 | const allClasses = classNames(commonClasses.row, classes.head) 11 | 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Label/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .label { 5 | color: var(--text-color-secondary); 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Label/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Label = ({ children, style }: ComponentBase) => ( 8 |

9 | {children} 10 |

11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Root/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .root { 5 | margin-top: 0.5rem; 6 | padding: 0 0.5rem; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Root/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Root = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Row/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .body { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | display: grid; 7 | grid-template-columns: repeat(3, 1fr); 8 | padding: 1.05rem 0; 9 | 10 | &:last-child { 11 | border-bottom: none; 12 | padding-bottom: 0.5rem; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/Row/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { ComponentBase } from 'types' 6 | import commonClasses from '../common.module.scss' 7 | import classes from './index.module.scss' 8 | 9 | export const Row = ({ children, style }: ComponentBase) => { 10 | const allClasses = classNames(commonClasses.row, classes.body) 11 | 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/common.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .row { 5 | padding: 0.6rem 0; 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/RewardGrid/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Cell } from './Cell' 5 | import { Cells } from './Cells' 6 | import { Head } from './Head' 7 | import { Label } from './Label' 8 | import { Root } from './Root' 9 | import { Row } from './Row' 10 | 11 | export const RewardGrid = { 12 | Root, 13 | Head, 14 | Row, 15 | Cell, 16 | Cells, 17 | Label, 18 | } 19 | 20 | export default RewardGrid 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Separator/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .separator { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | margin: 0.67rem 0; 7 | width: 100%; 8 | 9 | &.lg { 10 | margin: 1.2rem 0; 11 | } 12 | 13 | &.transparent { 14 | border: none; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Spinner/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Spinner = ({ style }: ComponentBase) => ( 8 |
9 | ) 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Content/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .content { 5 | padding-left: 1.25rem; 6 | flex-basis: 70%; 7 | flex: 1; 8 | display: flex; 9 | flex-flow: column wrap; 10 | justify-content: center; 11 | overflow: hidden; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Content/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | /** 8 | * @name Content 9 | * @summary Used to house the title contents within a `StatRow`. 10 | */ 11 | export const Content = ({ children, style }: ComponentBase) => ( 12 |
13 | {children} 14 |
15 | ) 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Graphic/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .graphic { 5 | margin-left: 1rem; 6 | display: flex; 7 | align-items: center; 8 | justify-content: center; 9 | width: fit-content; 10 | min-width: 1.75rem; 11 | height: 100%; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Graphic/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | /** 8 | * @name Graphic 9 | * @summary Used to house a graphic in a `StatCard` 10 | */ 11 | export const Graphic = ({ children, style }: ComponentBase) => ( 12 |
13 | {children} 14 |
15 | ) 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Row/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .row { 5 | display: flex; 6 | flex-flow: row wrap; 7 | margin-top: 1rem; 8 | > div:last-child { 9 | margin-bottom: 0; 10 | > div { 11 | margin-right: 0; 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Subtitle/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .subtitle { 5 | color: var(--text-color-secondary); 6 | font-family: InterSemiBold, sans-serif; 7 | flex: 1; 8 | display: flex; 9 | flex-flow: row wrap; 10 | align-items: center; 11 | 12 | &.primary { 13 | color: var(--accent-color-primary); 14 | > svg { 15 | margin-left: 0.5rem; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Total/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .total { 5 | color: var(--text-color-secondary); 6 | display: flex; 7 | font-size: 0.95rem; 8 | margin-left: 0.4rem; 9 | position: relative; 10 | bottom: 0.1rem; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/Total/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Total = ({ children, style }: ComponentBase) => ( 8 | 9 | {children} 10 | 11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/Stat/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Button, Card } from './Card' 5 | import { Content } from './Content' 6 | import { Graphic } from './Graphic' 7 | import { Row } from './Row' 8 | import { Subtitle } from './Subtitle' 9 | import { Title } from './Title' 10 | import { Total } from './Total' 11 | 12 | export const Stat = { 13 | Button, 14 | Card, 15 | Content, 16 | Graphic, 17 | Row, 18 | Subtitle, 19 | Title, 20 | Total, 21 | } 22 | 23 | export default Stat 24 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/TokenFiat/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import type { ComponentBase } from 'types' 6 | import classes from './index.module.scss' 7 | 8 | export const TokenFiat = ({ 9 | children, 10 | style, 11 | Token, 12 | }: ComponentBase & { 13 | Token: ReactNode 14 | }) => ( 15 |
16 |
{Token}
17 |
{children}
18 |
19 | ) 20 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/TooltipArea/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .tooltipArea { 5 | position: absolute; 6 | width: 100%; 7 | height: 100%; 8 | top: 0%; 9 | left: 0%; 10 | z-index: 1; 11 | &.pointer { 12 | cursor: pointer; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './AccountImport' 5 | export * from './ButtonRow' 6 | export * from './CardHeader' 7 | export * from './CardLabel' 8 | export * from './Countdown' 9 | export * from './Identity' 10 | export * from './Offline' 11 | export * from './Page' 12 | export * from './RewardGrid' 13 | export * from './Separator' 14 | export * from './Spinner' 15 | export * from './Stat' 16 | export * from './TokenFiat' 17 | export * from './Tooltip' 18 | export * from './TooltipArea' 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/base/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | 6 | export type RowProps = ComponentBase & { 7 | yMargin?: boolean 8 | xMargin?: boolean 9 | } 10 | 11 | export type TooltipAreaProps = ComponentBase & { 12 | text: string 13 | pointer?: boolean 14 | onMouseMove: () => void 15 | onClick?: () => void 16 | } 17 | 18 | export type IdentityProps = ComponentBase & { 19 | Icon: React.ReactNode 20 | Action?: React.ReactNode 21 | label: string 22 | value: string 23 | } 24 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/AccountTitle/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const AccountTitle = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Container/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .container { 5 | display: flex; 6 | flex-wrap: wrap; 7 | justify-content: center; 8 | align-items: center; 9 | position: fixed; 10 | z-index: 10; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Content/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | @import '../_variables'; 5 | 6 | .content { 7 | width: 100%; 8 | min-height: 100vh; 9 | display: flex; 10 | flex-direction: column; 11 | align-items: center; 12 | margin: 0 auto; 13 | 14 | &.lg { 15 | max-width: $canvas-width-lg; 16 | } 17 | &.xl { 18 | max-width: $canvas-width-xl; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/FootFullWidth/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .footFullWidth { 5 | background: var(--background-modal-footer); 6 | width: 100%; 7 | display: flex; 8 | justify-content: center; 9 | padding: 1rem 1rem 0 1rem; 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/FootFullWidth/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const FootFullWidth = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Footer/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | @import '../_variables'; 5 | 6 | .footer { 7 | border-radius: 1rem; 8 | overflow: hidden; 9 | width: 100%; 10 | 11 | &.lg { 12 | max-width: $canvas-width-lg; 13 | margin-bottom: 2rem; 14 | } 15 | 16 | &.xl { 17 | max-width: $canvas-width-xl; 18 | margin-bottom: 2rem; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/GraphContainer/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const GraphContainer = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/GraphInner/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .graphInner { 5 | flex: 1; 6 | position: relative; 7 | padding: 0 4rem 0 1rem; 8 | margin-top: 2rem; 9 | 10 | @media (max-width: 1000px) { 11 | padding: 0 0 0 1rem; 12 | } 13 | > .inner { 14 | position: absolute; 15 | width: 100%; 16 | height: 100%; 17 | padding-left: 1rem; 18 | padding-right: 4rem; 19 | 20 | @media (max-width: 1000px) { 21 | padding-right: 1.5rem; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Head/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .head { 5 | display: flex; 6 | align-items: center; 7 | justify-content: flex-end; 8 | padding-top: 1rem; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Head/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Head = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/HeadFullWidth/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .headFullWidth { 5 | border-bottom: 1px solid var(--border-secondary-color); 6 | width: 100%; 7 | display: flex; 8 | align-items: center; 9 | padding: 0 1.5rem; 10 | justify-content: center; 11 | height: 4.5rem; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/HeadFullWidth/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const HeadFullWidth = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/HeadTags/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const HeadTags = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Interface/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classes from './index.module.scss' 5 | 6 | export const Interface = ({ 7 | Main, 8 | Side, 9 | }: { 10 | Main: React.ReactNode 11 | Side?: React.ReactNode 12 | }) => ( 13 |
14 | {Main &&
{Main}
} 15 | {Side &&
{Side}
} 16 |
17 | ) 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Loader/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classes from './index.module.scss' 5 | 6 | export const Loader = () =>
7 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Scroll/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .scroll { 5 | width: 100%; 6 | height: 100%; 7 | position: relative; 8 | z-index: 9; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/Subheading/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Subheading = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/_variables.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | $canvas-width-lg: 800px; 5 | $canvas-width-xl: 1250px; 6 | -------------------------------------------------------------------------------- /packages/ui-core/src/canvas/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { AnimationProps } from 'framer-motion' 5 | import type { ComponentBase } from 'types' 6 | 7 | export type ScrollProps = ComponentBase & AnimationProps 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/input/Switch/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Switch as RadixSwitch } from 'radix-ui' 5 | import type { SwitchProps } from '../types' 6 | import classes from './index.module.scss' 7 | 8 | export const Switch = ({ checked }: SwitchProps) => ( 9 | 10 | 11 | 12 | ) 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/input/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './Switch' 5 | export * from './TokenInput' 6 | -------------------------------------------------------------------------------- /packages/ui-core/src/input/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ChangeEvent } from 'react' 5 | 6 | export interface TokenInputProps { 7 | onChange: (e: ChangeEvent) => void 8 | placeholder: string 9 | value: string 10 | marginY?: boolean 11 | id: string 12 | label: string 13 | } 14 | 15 | export interface SwitchProps { 16 | checked: boolean 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/HeaderButtonRow/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .headerButtonRow { 5 | display: flex; 6 | justify-content: flex-end; 7 | align-items: center; 8 | overflow: hidden; 9 | flex-grow: 1; 10 | padding-right: 0.25rem; 11 | height: inherit; 12 | 13 | > div:last-child { 14 | margin-right: 0; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/HeaderButtonRow/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { LabelRowProps } from '../types' 6 | import classes from './index.module.scss' 7 | 8 | export const HeaderButtonRow = ({ children, style, inline }: LabelRowProps) => { 9 | const allClasses = classNames(classes.headerButtonRow, { 10 | [classes.inline]: !!inline, 11 | }) 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/Identity/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Identity = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/Label/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .label { 5 | color: var(--text-color-secondary); 6 | position: relative; 7 | display: flex; 8 | align-items: center; 9 | justify-content: center; 10 | font-size: inherit; 11 | margin: 0 0.4em; 12 | font-size: 0.85rem; 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/Label/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Label = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/LabelRow/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .labelRow { 5 | display: flex; 6 | justify-content: flex-end; 7 | align-items: center; 8 | flex-grow: 1; 9 | overflow: hidden; 10 | padding-left: 0.25rem; 11 | &.inline { 12 | margin-bottom: 0.9rem; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/LabelRow/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { LabelRowProps } from '../types' 6 | import classes from './index.module.scss' 7 | 8 | export const LabelRow = ({ children, style, inline }: LabelRowProps) => { 9 | const allClasses = classNames(classes.labelRow, { 10 | [classes.inline]: !!inline, 11 | }) 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/Separator/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .separator { 5 | border-bottom: 1px solid var(--border-primary-color); 6 | width: 100%; 7 | height: 1px; 8 | opacity: 0.7; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/Separator/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Separator = ({ style }: ComponentBase) => ( 8 |
9 | ) 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/list/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './Checkbox' 5 | export * from './Graph' 6 | export * from './HeaderButton' 7 | export * from './HeaderButtonRow' 8 | export * from './Identity' 9 | export * from './Label' 10 | export * from './LabelRow' 11 | export * from './Separator' 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/AddressHeader/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .addressHeader { 5 | display: flex; 6 | align-items: center; 7 | padding: 1rem 1rem 0; 8 | width: 100%; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/AddressHeader/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const AddressHeader = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Card/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .card { 5 | background: var(--background-modal); 6 | transition: opacity 0.15s; 7 | &.dimmed { 8 | opacity: 0; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Close/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .close { 5 | position: absolute; 6 | right: 1.5rem; 7 | top: 1.5rem; 8 | z-index: 2; 9 | > button { 10 | opacity: 0.6; 11 | transition: opacity var(--transition-duration) ease-in-out; 12 | &:hover { 13 | opacity: 1; 14 | } 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Close/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { faXmark } from '@fortawesome/free-solid-svg-icons' 5 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 6 | import classes from './index.module.scss' 7 | 8 | export const Close = ({ onClose }: { onClose: () => void }) => ( 9 |
10 | 13 |
14 | ) 15 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Container/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .container { 5 | z-index: 9; 6 | > div { 7 | height: 100%; 8 | display: flex; 9 | justify-content: center; 10 | align-items: center; 11 | padding: 1rem 2rem; 12 | } 13 | .close { 14 | position: fixed; 15 | width: 100%; 16 | height: 100%; 17 | z-index: 8; 18 | cursor: default; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Content/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .content { 5 | width: 100%; 6 | height: auto; 7 | overflow: hidden; 8 | position: relative; 9 | padding: 5rem 0; 10 | 11 | &.canvas { 12 | padding: 0; 13 | min-height: 100vh; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/CustomHeader/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const CustomHeader = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/FixedTitle/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .fixedTitle { 5 | background: transparent; 6 | padding: 1rem 0 0; 7 | width: 100%; 8 | 9 | &.withStyle { 10 | background: var(--background-default); 11 | padding: 1rem 1rem 0; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Multi/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .multi { 5 | border-radius: 1rem; 6 | display: flex; 7 | flex-direction: column; 8 | height: auto; 9 | overflow: hidden auto; 10 | flex-grow: 1; 11 | 12 | .two { 13 | flex-basis: 50%; 14 | min-width: 50%; 15 | } 16 | .three { 17 | flex-basis: 33.33%; 18 | min-width: 33.33%; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/MultiThree/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .multiThree { 5 | width: 300%; 6 | > div { 7 | flex-basis: 33.33%; 8 | min-width: 33.33%; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/MultiTwo/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .multiTwo { 5 | width: 200%; 6 | > div { 7 | flex-basis: 50%; 8 | min-width: 50%; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Notes/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .notes { 5 | width: 100%; 6 | padding: 0; 7 | &.withPadding { 8 | padding: 0.75rem 0; 9 | } 10 | > p { 11 | color: var(--text-color-secondary); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Notes/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { NotesProps } from '../types' 6 | import classes from './index.module.scss' 7 | 8 | export const Notes = ({ children, style, withPadding }: NotesProps) => { 9 | const allClasses = classNames(classes.notes, { 10 | [classes.withPadding]: withPadding, 11 | }) 12 | return ( 13 |
14 | {children} 15 |
16 | ) 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Padding/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .padding { 5 | display: flex; 6 | flex-flow: column wrap; 7 | padding: 1rem; 8 | 9 | &.verticalOnly { 10 | padding: 1rem 0 0.25rem; 11 | } 12 | 13 | &.horizontalOnly { 14 | padding: 0 1rem; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Scroll/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .scroll { 5 | border-radius: 1rem; 6 | position: relative; 7 | z-index: 9; 8 | max-height: 100%; 9 | width: 100%; 10 | max-width: 600px; 11 | &.xs { 12 | max-width: 425px; 13 | } 14 | &.lg { 15 | max-width: 800px; 16 | } 17 | &.xl { 18 | max-width: 1250px; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Section/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .carousel { 5 | display: flex; 6 | flex-flow: column wrap; 7 | padding: 0; 8 | position: relative; 9 | overflow: hidden auto; 10 | width: 100%; 11 | } 12 | 13 | .tab { 14 | display: flex; 15 | margin: 1.25rem 0 0.25rem; 16 | width: 100%; 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Section/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import classNames from 'classnames' 5 | import type { SectionProps } from '../types' 6 | import classes from './index.module.scss' 7 | 8 | export const Section = ({ children, style, type }: SectionProps) => { 9 | const allClasses = classNames({ 10 | [classes.carousel]: type === 'carousel', 11 | [classes.tab]: type === 'tab', 12 | }) 13 | return ( 14 |
15 | {children} 16 |
17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Title/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .title { 5 | font-family: Poppins700, sans-serif; 6 | font-weight: 700; 7 | font-size: 1.5rem; 8 | margin: 1rem 0; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Title/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Title = ({ children, style }: ComponentBase) => ( 8 |

9 | {children} 10 |

11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Warnings/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .warnings { 5 | margin-top: 0.75rem; 6 | width: 100%; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/modal/Warnings/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ComponentBase } from 'types' 5 | import classes from './index.module.scss' 6 | 7 | export const Warnings = ({ children, style }: ComponentBase) => ( 8 |
9 | {children} 10 |
11 | ) 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/overlay/Backdrop/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .backdrop { 5 | background: var(--modal-background-color); 6 | z-index: 9; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/overlay/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './Backdrop' 5 | -------------------------------------------------------------------------------- /packages/ui-core/src/overlay/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { AnimationProps } from 'framer-motion' 5 | import type { ComponentBase } from 'types' 6 | 7 | export type BackdropProps = ComponentBase & 8 | AnimationProps & { 9 | blur?: string 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Heading/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .heading { 5 | background: var(--button-popover-tab-background); 6 | height: 3rem; 7 | display: flex; 8 | align-items: center; 9 | padding: 0 0.75rem; 10 | 11 | > h4 { 12 | color: var(--text-color-tertiary); 13 | font-family: InterSemiBold, sans-serif; 14 | overflow: hidden; 15 | flex-grow: 1; 16 | } 17 | 18 | > div { 19 | display: flex; 20 | justify-content: flex-end; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Heading/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import classes from './index.module.scss' 6 | 7 | export const Heading = ({ 8 | text, 9 | children, 10 | }: { 11 | text: string 12 | children: ReactNode 13 | }) => ( 14 |
15 |

{text}

16 |
{children}
17 |
18 | ) 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Icon/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .icon { 5 | color: var(--text-color-secondary); 6 | font-family: InterSemiBold, sans-serif; 7 | padding-right: 1rem; 8 | 9 | svg { 10 | margin-right: 0.2rem; 11 | font-size: 1rem; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Icon/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { IconDefinition } from '@fortawesome/free-solid-svg-icons' 5 | import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' 6 | import classes from './index.module.scss' 7 | 8 | export const Icon = ({ faIcon }: { faIcon: IconDefinition }) => ( 9 |
10 | 11 |
12 | ) 13 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Logo/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .logo { 5 | background: var(--button-secondary-background); 6 | border-radius: 50%; 7 | width: 2.75rem; 8 | height: 2.75rem; 9 | display: flex; 10 | align-items: center; 11 | justify-content: center; 12 | 13 | > svg { 14 | width: 62%; 15 | height: 62%; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/Logo/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { FunctionComponent, SVGProps } from 'react' 5 | import classes from './index.module.scss' 6 | 7 | export const Logo = ({ 8 | Svg, 9 | }: { 10 | Svg: FunctionComponent> 11 | }) => {} 12 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/WebUrl/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .webUrl { 5 | color: var(--text-color-tertiary); 6 | font-family: Inter, sans-serif; 7 | display: flex; 8 | align-items: center; 9 | 10 | > button { 11 | color: var(--text-color-tertiary); 12 | font-size: 1.1rem; 13 | margin-top: 0.2rem; 14 | text-decoration: none; 15 | width: auto; 16 | 17 | &:hover { 18 | text-decoration: underline; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/ConnectItem/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Container } from './Container' 5 | import { Heading } from './Heading' 6 | import { Icon } from './Icon' 7 | import { Item } from './Item' 8 | import { Logo } from './Logo' 9 | import { WebUrl } from './WebUrl' 10 | 11 | export const ConnectItem = { 12 | Container, 13 | Heading, 14 | Icon, 15 | Item, 16 | Logo, 17 | WebUrl, 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Padding/index.module.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | .padding { 5 | padding: 0 1.4rem; 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Padding/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { CSSProperties, ReactNode } from 'react' 5 | import classes from './index.module.scss' 6 | 7 | export const Padding = ({ 8 | flex, 9 | children, 10 | style, 11 | }: { 12 | flex?: boolean 13 | children: ReactNode 14 | style?: CSSProperties 15 | }) => ( 16 |
20 | {children} 21 |
22 | ) 23 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Stat/Label/index.module.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | .label { 5 | margin-top: 1rem; 6 | margin-bottom: 0; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Stat/Label/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import classes from './index.module.scss' 6 | 7 | export const Label = ({ children }: { children: ReactNode }) => ( 8 |

{children}

9 | ) 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Stat/Value/index.module.scss: -------------------------------------------------------------------------------- 1 | /* Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | SPDX-License-Identifier: GPL-3.0-only */ 3 | 4 | .value { 5 | margin-top: 0.5rem; 6 | margin-bottom: 1rem; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Stat/Value/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { ReactNode } from 'react' 5 | import classes from './index.module.scss' 6 | 7 | export const Value = ({ children }: { children: ReactNode }) => ( 8 |

{children}

9 | ) 10 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/Stat/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Label } from './Label' 5 | import { Value } from './Value' 6 | 7 | export const Stat = { 8 | Label, 9 | Value, 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-core/src/popover/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './ConnectItem' 5 | export * from './MenuItem' 6 | export * from './Padding' 7 | export * from './Popover' 8 | export * from './Stat' 9 | -------------------------------------------------------------------------------- /packages/ui-core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src", "../../env.d.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui-graphs/CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.1.0](https://github.com/polkadot-cloud/polkadot-staking-dashboard/compare/ui-graphs-v1.0.0...ui-graphs-v1.1.0) (2025-02-24) 4 | 5 | 6 | ### Features 7 | 8 | * **refactor:** Init `ui-graphs`, replace pie chart with pure CSS `Pie` component ([#2496](https://github.com/polkadot-cloud/polkadot-staking-dashboard/issues/2496)) ([98adc49](https://github.com/polkadot-cloud/polkadot-staking-dashboard/commit/98adc49a7dfb423d422b77f200b32aacb45b198c)) 9 | -------------------------------------------------------------------------------- /packages/ui-graphs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-graphs", 3 | "version": "1.1.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 8 | }, 9 | "exports": { 10 | ".": "./src/index.tsx", 11 | "./types": "./src/types.ts" 12 | }, 13 | "dependencies": { 14 | "react": "^19.1.0", 15 | "styled-components": "^6.1.18" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/ui-graphs/src/Pie/index.module.scss: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | .pie { 5 | position: relative; 6 | 7 | > svg { 8 | width: 100%; 9 | height: 100%; 10 | display: block; 11 | position: absolute; 12 | top: 0; 13 | left: 0; 14 | overflow: visible; 15 | 16 | > circle { 17 | fill: transparent; 18 | stroke-width: 31.8309886184; 19 | stroke-dasharray: 0, 0, 0, 100; 20 | stroke-dashoffset: 25; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /packages/ui-graphs/src/Pie/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface Props { 5 | value: number 6 | size?: string | number 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-graphs/src/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './Pie' 5 | export * from './util' 6 | -------------------------------------------------------------------------------- /packages/ui-graphs/src/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export interface PieProps { 5 | color1?: string 6 | color2?: string 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui-graphs/src/util.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export const percentageOf = (n1: number, n2: number): number => { 5 | if (n2 === 0) { 6 | return 0 7 | } 8 | const p = (n1 / n2) * 100 9 | return p > 100 ? 100 : p 10 | } 11 | -------------------------------------------------------------------------------- /packages/ui-graphs/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src", "../../env.d.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui-identity/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ui-identity", 3 | "version": "1.1.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "scripts": { 7 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 8 | }, 9 | "exports": { 10 | ".": "./src/index.tsx", 11 | "./types": "./src/types.ts" 12 | }, 13 | "dependencies": { 14 | "@w3ux/react-polkicon": "^3.1.2", 15 | "@w3ux/utils": "2.0.10", 16 | "react": "^19.1.0", 17 | "ui-core": "workspace:*" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/ui-identity/src/types.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type React from 'react' 5 | 6 | export interface IdentityProps { 7 | title: string 8 | address: string 9 | identity?: string 10 | Action: React.ReactNode 11 | iconSize?: string | number 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui-identity/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src", "../../env.d.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/ui-overlay/src/Close.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Close as Wrapper } from 'ui-core/modal' 5 | import { useOverlay } from 'ui-overlay' 6 | 7 | export const Close = () => { 8 | const { setModalStatus } = useOverlay().modal 9 | 10 | return setModalStatus('closing')} /> 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-overlay/src/CloseCanvas.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import { Close as Wrapper } from 'ui-core/canvas' 5 | import { useOverlay } from 'ui-overlay' 6 | 7 | export const CloseCanvas = ({ sm }: { sm?: boolean }) => { 8 | const { closeCanvas } = useOverlay().canvas 9 | 10 | return closeCanvas()} /> 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui-overlay/src/Provider/defaults.ts: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | import type { CanvasConfig, ModalConfig } from './types' 5 | 6 | export const defaultModalConfig: ModalConfig = { 7 | key: '', 8 | size: undefined, 9 | options: {}, 10 | } 11 | 12 | export const defaultCanvasConfig: CanvasConfig = { 13 | key: '', 14 | options: {}, 15 | scroll: true, 16 | } 17 | -------------------------------------------------------------------------------- /packages/ui-overlay/src/index.tsx: -------------------------------------------------------------------------------- 1 | // Copyright 2025 @polkadot-cloud/polkadot-staking-dashboard authors & contributors 2 | // SPDX-License-Identifier: GPL-3.0-only 3 | 4 | export * from './Close' 5 | export * from './CloseCanvas' 6 | export * from './Overlay' 7 | export * from './Provider' 8 | -------------------------------------------------------------------------------- /packages/ui-overlay/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src", "../../env.d.ts"] 4 | } 5 | -------------------------------------------------------------------------------- /packages/utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "utils", 3 | "version": "1.1.0", 4 | "license": "GPL-3.0-only", 5 | "type": "module", 6 | "main": "src/index.ts", 7 | "scripts": { 8 | "clear": "rm -rf build tsconfig.tsbuildinfo dist" 9 | }, 10 | "dependencies": { 11 | "@w3ux/hooks": "^2.1.0", 12 | "@w3ux/utils": "2.0.10", 13 | "bignumber.js": "^9.3.0", 14 | "date-fns": "^4.1.0", 15 | "dedot": "^0.12.0", 16 | "i18next": "^25.2.1" 17 | }, 18 | "devDependencies": { 19 | "types": "workspace:*" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/utils/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "../../tsconfig.react.json", 3 | "include": ["src"] 4 | } 5 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - packages/* 3 | onlyBuiltDependencies: 4 | - '@swc/core' 5 | - bufferutil 6 | - esbuild 7 | - keccak 8 | - sharp 9 | - utf-8-validate 10 | - unrs-resolver 11 | -------------------------------------------------------------------------------- /release-please-config.json: -------------------------------------------------------------------------------- 1 | { 2 | "last-release-sha": "99cfade027ce6ca81d0a14657d6bdd1b05406ad8", 3 | "include-component-in-tag": true, 4 | "packages": { 5 | "packages/app": {}, 6 | "packages/assets": {}, 7 | "packages/consts": {}, 8 | "packages/locales": {}, 9 | "packages/plugin-staking-api": {}, 10 | "packages/styles": {}, 11 | "packages/types": {}, 12 | "packages/ui-buttons": {}, 13 | "packages/ui-core": {}, 14 | "packages/ui-graphs": {}, 15 | "packages/ui-identity": {}, 16 | "packages/ui-overlay": {}, 17 | "packages/utils": {} 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "include": ["./packages/**/*", "**/*.d.ts"], 4 | "exclude": ["**/*/node_modules", "**/*/dist", "**/*/lottie"] 5 | } 6 | -------------------------------------------------------------------------------- /tsconfig.react.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "jsx": "react-jsx" 5 | } 6 | } 7 | --------------------------------------------------------------------------------