Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: TAO staking #1682

Open
wants to merge 45 commits into
base: dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
95a235f
feat: display stake button for TAO token
UrbanWill Oct 31, 2024
f9cf9dd
feat: created bittensor validator hook, dinamically display pool info…
UrbanWill Nov 1, 2024
01e8f44
feat: useGetStakingInfo hook, and auxiliary hooks to fetch staking fo…
UrbanWill Nov 2, 2024
23415a9
feat: updated NoomPoolBondWizard, updated component types
UrbanWill Nov 2, 2024
7a2aaf7
feat: hooks for bittensor hotkeys and validators
UrbanWill Nov 3, 2024
c3c070b
feat: display bittensor validator name and unbound button
UrbanWill Nov 3, 2024
41eb99c
feat: hooks for fetching nomPooldata, consolidated data in useGetUnb…
UrbanWill Nov 3, 2024
7111f55
feat: unbond TAO, totalStaked and unbondPayload hooks
UrbanWill Nov 3, 2024
c092184
fix: poolname, unbond btn and loading sekeleton displayed when it sho…
UrbanWill Nov 3, 2024
d8f8ab3
fix: staking TAO with remark
UrbanWill Nov 4, 2024
d0611e8
chore: added taostats api key to env and webpack
UrbanWill Nov 4, 2024
580eec6
feat: unbond TAO, display tao unbond info
UrbanWill Nov 4, 2024
9821a16
feat: useGetBittensorMinJoinBond
UrbanWill Nov 4, 2024
27dd3b3
refactor: conslidated data in useGetStakeInfo hook
UrbanWill Nov 4, 2024
3adc0d6
fix: max button not working before input,
UrbanWill Nov 4, 2024
d97dbe3
chore: tidy up useGetUnbondInfo
UrbanWill Nov 4, 2024
952b4eb
feat: added hooks to fetch and calculated if can stake bittensor
UrbanWill Nov 5, 2024
0aeec5c
feat: display stake warning message and tooltip
UrbanWill Nov 5, 2024
b05ddbc
chore: renamed NomPoolBond folder and items to "Bond"
UrbanWill Nov 5, 2024
b942d30
chore: renamed NomPoolUnboond folder and items to "Unbond"
UrbanWill Nov 5, 2024
8f8b160
chore: created hooks folder, organized bittensor and nomPools hooks
UrbanWill Nov 5, 2024
1efd7b8
fix: bittensor cooldown when switching accounts back and forth
UrbanWill Nov 5, 2024
221848b
chore: added comment
UrbanWill Nov 5, 2024
7249328
chore: renamed component name to be generic to bonds
UrbanWill Nov 5, 2024
31992e9
feat: added BondSelectDrawer for popup UI
UrbanWill Nov 8, 2024
46ebf8e
feat: added BittensorBondSelectDrawer
UrbanWill Nov 8, 2024
f151740
feat: hooks to fetch and merged Bittensor delegators data
UrbanWill Nov 9, 2024
2c2e1e7
feat: bondSelectDrawer, bond skeleton option
UrbanWill Nov 9, 2024
4fc6fe3
feat: sort delegators
UrbanWill Nov 9, 2024
5804380
feat: open modal with "select" option when asset is TAO
UrbanWill Nov 11, 2024
8664199
refactor: delegate select drawer to form in modal
UrbanWill Nov 12, 2024
c4b0bc7
fix: add 10 min staleTime for taostats queries
UrbanWill Nov 12, 2024
c01b4b2
feat: hooks for fetching staked balance per delegator
UrbanWill Nov 13, 2024
f99ee09
fix: bondPoolName when doing anything but staking
UrbanWill Nov 13, 2024
02e8e76
refactor: display delegator stake position on AssetDetails components
UrbanWill Nov 13, 2024
3260a82
fix: bondPooName should receive chainId as props
UrbanWill Nov 13, 2024
b6f163e
feat: unstake by delegator data
UrbanWill Nov 13, 2024
9ac4c91
fix: stake cooldown when switching accounts
UrbanWill Nov 13, 2024
4202011
feat: track unstake block number and use it for stake cooldown
UrbanWill Nov 13, 2024
eb80cd3
fix: bondOption token formartting, icon
UrbanWill Nov 14, 2024
50d47cf
chore: added changeset to util package
UrbanWill Nov 14, 2024
8d0644a
feat: fetch data from rpc instead of taostats, display TAO staked in …
UrbanWill Nov 14, 2024
2678f88
refactor: fetch total staked from rpc when unbonding, remove unused h…
UrbanWill Nov 14, 2024
fa98f84
fix: delegators sorting race condition
UrbanWill Nov 14, 2024
76b46c2
chore: minor RemoteConfigStore type updates
UrbanWill Nov 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/loud-maps-pay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@talismn/util": patch
---

added formatTokenDecimals util fn
4 changes: 3 additions & 1 deletion apps/extension/.env.sample
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
# TEST_MNEMONIC=blarg blarg blarg blarg blarg blarg blarg blarg blarg blarg blarg blarg

# for dev only, Coingecko api settings
# # with a paid api key, use url https://pro-api.coingecko.com
# # with a paid api key, use url https://pro-api.coingecko.com
# COINGECKO_API_URL=https://api.coingecko.com
# # with a paid api key, use header name x-cg-pro-api-key
# COINGECKO_API_KEY_NAME=x-cg-demo-api-key
Expand All @@ -25,3 +25,5 @@
# Talisman core dev team setup for tx analysis :
# BLOWFISH_API_KEY=<PASSWORD_FOR_DEVMODE>
# BLOWFISH_QA_API_KEY=<PASSWORD_FOR_QA_BUILDS> # optional : only used for canary, ci & qa builds

# TAOSTATS_API_KEY=<YOUR_OWN_API_KEY>
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@ import { AccountRenameModal } from "@ui/domains/Account/AccountRenameModal"
import { BuyTokensModal } from "@ui/domains/Asset/Buy/BuyTokensModal"
import { CopyAddressModal } from "@ui/domains/CopyAddress"
import { MigratePasswordModal } from "@ui/domains/Settings/MigratePassword/MigratePasswordModal"
import { NomPoolBondModal } from "@ui/domains/Staking/NomPoolBond/NomPoolBondModal"
import { NomPoolUnbondModal } from "@ui/domains/Staking/NomPoolUnbond/NomPoolUnbondModal"
import { BondModal } from "@ui/domains/Staking/Bond/BondModal"
import { NomPoolWithdrawModal } from "@ui/domains/Staking/NomPoolWithdraw/NomPoolWithdrawModal"
import { UnbondModal } from "@ui/domains/Staking/Unbond/UnbondModal"
import { ExplorerNetworkPickerModal } from "@ui/domains/ViewOnExplorer"

import DashboardNotifications from "."
Expand Down Expand Up @@ -48,8 +48,8 @@ export const DashboardNotificationsAndModals = () => {
<ExplorerNetworkPickerModal />
<MigratePasswordModal />
<OnboardingToast />
<NomPoolBondModal />
<NomPoolUnbondModal />
<BondModal />
<UnbondModal />
<NomPoolWithdrawModal />
</Suspense>
)
Expand Down
8 changes: 4 additions & 4 deletions apps/extension/src/ui/apps/popup/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import { AccountRemoveModal } from "@ui/domains/Account/AccountRemoveModal"
import { AccountRenameModal } from "@ui/domains/Account/AccountRenameModal"
import { CopyAddressModal } from "@ui/domains/CopyAddress"
import { DatabaseErrorAlert } from "@ui/domains/Settings/DatabaseErrorAlert"
import { NomPoolBondModal } from "@ui/domains/Staking/NomPoolBond/NomPoolBondModal"
import { NomPoolUnbondModal } from "@ui/domains/Staking/NomPoolUnbond/NomPoolUnbondModal"
import { BondModal } from "@ui/domains/Staking/Bond/BondModal"
import { NomPoolWithdrawModal } from "@ui/domains/Staking/NomPoolWithdraw/NomPoolWithdrawModal"
import { UnbondModal } from "@ui/domains/Staking/Unbond/UnbondModal"
import { ExplorerNetworkPickerModal } from "@ui/domains/ViewOnExplorer"
import { useLoginCheck } from "@ui/hooks/useLoginCheck"

Expand Down Expand Up @@ -91,8 +91,8 @@ const Popup = () => {
<ExplorerNetworkPickerModal />
<BackupWarningDrawer />
<LedgerPolkadotUpgradeAlertDrawer />
<NomPoolBondModal />
<NomPoolUnbondModal />
<BondModal />
<UnbondModal />
<NomPoolWithdrawModal />
</Suspense>
{/* Render outside of suspense or it will never show in case of migration error */}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ import { TokenLogo } from "@ui/domains/Asset/TokenLogo"
import Tokens from "@ui/domains/Asset/Tokens"
import { AssetBalanceCellValue } from "@ui/domains/Portfolio/AssetBalanceCellValue"
import { NoTokensMessage } from "@ui/domains/Portfolio/NoTokensMessage"
import { NomPoolBondButton } from "@ui/domains/Staking/NomPoolBond/NomPoolBondButton"
import { NomPoolUnbondButton } from "@ui/domains/Staking/NomPoolUnbond/NomPoolUnbondButton"
import { BondButton } from "@ui/domains/Staking/Bond/BondButton"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/hooks/nomPools/useNomPoolStakingStatus"
import { NomPoolWithdrawButton } from "@ui/domains/Staking/NomPoolWithdraw/NomPoolWithdrawButton"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/shared/useNomPoolStakingStatus"
import { UnbondButton } from "@ui/domains/Staking/Unbond/UnbondButton"
import { BalancesStatus } from "@ui/hooks/useBalancesStatus"
import { useSelectedCurrency } from "@ui/state"

Expand All @@ -35,11 +35,15 @@ const AssetState = ({
description,
render,
address,
isLoading,
locked,
}: {
title: string
description?: string
render: boolean
address?: Address
isLoading?: boolean
locked?: boolean
}) => {
if (!render) return null
return (
Expand All @@ -55,6 +59,9 @@ const AssetState = ({
</div>
)}
{/* show description below title when address is not set */}
{isLoading && !description && locked && (
<div className="bg-grey-700 rounded-xs h-[1.6rem] w-80 animate-pulse" />
)}
{description && !address && (
<div className="flex-shrink-0 truncate text-sm">{description}</div>
)}
Expand Down Expand Up @@ -123,7 +130,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => {
/>
</div>
<div className="flex items-center justify-end gap-2">
{tokenId && <NomPoolBondButton tokenId={tokenId} balances={balances} />}
{tokenId && <BondButton tokenId={tokenId} balances={balances} />}
<AssetBalanceCellValue
render
tokens={summary.availableTokens}
Expand Down Expand Up @@ -252,7 +259,14 @@ const ChainTokenBalancesDetailRow = ({
className={classNames("bg-grey-850 grid grid-cols-[40%_30%_30%]", isLastRow && "rounded-b")}
>
<div>
<AssetState title={row.title} description={row.description} render address={row.address} />
<AssetState
title={row.title}
description={row.description}
render
address={row.address}
isLoading={row.isLoading}
locked={row.locked}
/>
</div>
{!row.locked && <div></div>}
<div>
Expand All @@ -263,7 +277,9 @@ const ChainTokenBalancesDetailRow = ({
symbol={symbol}
locked={row.locked}
balancesStatus={status}
className={classNames(status.status === "fetching" && "animate-pulse transition-opacity")}
className={classNames(
(status.status === "fetching" || row.isLoading) && "animate-pulse transition-opacity",
)}
/>
</div>
{!!row.locked && row.meta && tokenId && (
Expand Down Expand Up @@ -305,12 +321,12 @@ const LockedExtra: FC<{
[accountStatus?.canWithdrawIn, rowMeta.unbonding],
)

if (!rowAddress || !accountStatus) return null
if (!rowAddress) return null

return (
<div className="flex h-[6.6rem] flex-col items-end justify-center gap-2 whitespace-nowrap p-8 text-right">
{rowMeta.unbonding ? (
accountStatus.canWithdraw ? (
accountStatus?.canWithdraw ? (
<NomPoolWithdrawButton tokenId={tokenId} address={rowAddress} variant="large" />
) : (
<>
Expand All @@ -327,8 +343,13 @@ const LockedExtra: FC<{
)}
</>
)
) : accountStatus.canUnstake ? (
<NomPoolUnbondButton tokenId={tokenId} address={rowAddress} variant="large" />
) : accountStatus?.canUnstake || tokenId === "bittensor-substrate-native" ? (
<UnbondButton
tokenId={tokenId}
address={rowAddress}
variant="large"
poolId={rowMeta.poolId}
/>
) : null}
</div>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,16 +15,16 @@ import { Fiat } from "@ui/domains/Asset/Fiat"
import { TokenLogo } from "@ui/domains/Asset/TokenLogo"
import Tokens from "@ui/domains/Asset/Tokens"
import { useCopyAddressModal } from "@ui/domains/CopyAddress"
import { NomPoolBondButton } from "@ui/domains/Staking/NomPoolBond/NomPoolBondButton"
import { NomPoolUnbondButton } from "@ui/domains/Staking/NomPoolUnbond/NomPoolUnbondButton"
import { usePortfolioNavigation } from "@ui/domains/Portfolio/usePortfolioNavigation"
import { BondButton } from "@ui/domains/Staking/Bond/BondButton"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/hooks/nomPools/useNomPoolStakingStatus"
import { NomPoolWithdrawButton } from "@ui/domains/Staking/NomPoolWithdraw/NomPoolWithdrawButton"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/shared/useNomPoolStakingStatus"
import { UnbondButton } from "@ui/domains/Staking/Unbond/UnbondButton"
import { useAnalytics } from "@ui/hooks/useAnalytics"
import { BalancesStatus } from "@ui/hooks/useBalancesStatus"
import { useFeatureFlag, useSelectedCurrency } from "@ui/state"

import { StaleBalancesIcon } from "../StaleBalancesIcon"
import { usePortfolioNavigation } from "../usePortfolioNavigation"
import { CopyAddressButton } from "./CopyAddressIconButton"
import { PortfolioAccount } from "./PortfolioAccount"
import { SendFundsButton } from "./SendFundsIconButton"
Expand Down Expand Up @@ -76,7 +76,7 @@ const ChainTokenBalances = ({ chainId, balances }: AssetRowProps) => {
{tokenId && (
<div className="size-[3.8rem] shrink-0 empty:hidden">
<Suspense fallback={<SuspenseTracker name="StakeButton" />}>
<NomPoolBondButton tokenId={tokenId} balances={balances} />
<BondButton tokenId={tokenId} balances={balances} />
</Suspense>
</div>
)}
Expand Down Expand Up @@ -211,7 +211,7 @@ const ChainTokenBalancesDetailRow = ({
tokenId={tokenId}
address={row.address}
rowMeta={row.meta}
isLoading={status.status === "fetching"}
isLoading={status.status === "fetching" || !!row.isLoading}
/>
)}
</div>
Expand All @@ -220,6 +220,9 @@ const ChainTokenBalancesDetailRow = ({
<PortfolioAccount address={row.address} />
</div>
)}
{row.isLoading && !row.description && row.locked && (
<div className="bg-grey-700 rounded-xs h-[1.6rem] max-w-48 animate-pulse" />
)}
{!row.address && row.description && (
<div className="overflow-hidden text-ellipsis whitespace-nowrap text-xs">
{row.description}
Expand Down Expand Up @@ -279,12 +282,12 @@ const LockedExtra: FC<{
[accountStatus?.canWithdrawIn, rowMeta.unbonding],
)

if (!rowAddress || !accountStatus) return null
if (!rowAddress) return null

return (
<>
{rowMeta.unbonding ? (
accountStatus.canWithdraw ? (
accountStatus?.canWithdraw ? (
<NomPoolWithdrawButton tokenId={tokenId} address={rowAddress} variant="small" />
) : (
<Tooltip>
Expand All @@ -305,8 +308,13 @@ const LockedExtra: FC<{
</Tooltip>
)
) : //eslint-disable-next-line @typescript-eslint/no-explicit-any
accountStatus.canUnstake ? (
<NomPoolUnbondButton tokenId={tokenId} address={rowAddress} variant="small" />
accountStatus?.canUnstake || tokenId === "bittensor-substrate-native" ? (
<UnbondButton
tokenId={tokenId}
address={rowAddress}
variant="small"
poolId={rowMeta.poolId}
/>
) : null}
</>
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@ import {
import urlJoin from "url-join"

import { SuspenseTracker } from "@talisman/components/SuspenseTracker"
import { useNomPoolBondModal } from "@ui/domains/Staking/NomPoolBond/useNomPoolBondModal"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/shared/useNomPoolStakingStatus"
import { useBondModal } from "@ui/domains/Staking/Bond/useBondModal"
import { useNomPoolStakingStatus } from "@ui/domains/Staking/hooks/nomPools/useNomPoolStakingStatus"
import { useViewOnExplorer } from "@ui/domains/ViewOnExplorer"
import { useAnalytics } from "@ui/hooks/useAnalytics"
import { useToken } from "@ui/state"
Expand Down Expand Up @@ -54,7 +54,7 @@ const StakeMenuItem: FC<{ tokenId: string }> = ({ tokenId }) => {
const { t } = useTranslation()
const { genericEvent } = useAnalytics()

const { open } = useNomPoolBondModal()
const { open } = useBondModal()
const { data: stakingStatus } = useNomPoolStakingStatus(tokenId)

const openArgs = useMemo<Parameters<typeof open>[0] | undefined>(() => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { useTranslation } from "react-i18next"
import { Address, Balances } from "@extension/core"
import { sortBigBy } from "@talisman/util/bigHelper"
import { cleanupNomPoolName } from "@ui/domains/Staking/helpers"
import { useCombineBittensorStakeInfo } from "@ui/domains/Staking/hooks/bittensor/useCombineBittensorStakeInfo"
import { useBalancesStatus } from "@ui/hooks/useBalancesStatus"
import { useNetworkCategory } from "@ui/hooks/useNetworkCategory"
import { useChain, useSelectedCurrency } from "@ui/state"
Expand All @@ -23,6 +24,7 @@ export type DetailRow = {
locked: boolean
address?: Address
meta?: any // eslint-disable-line @typescript-eslint/no-explicit-any
isLoading?: boolean
}

type ChainTokenBalancesParams = {
Expand All @@ -39,6 +41,11 @@ export const useChainTokenBalances = ({ chainId, balances }: ChainTokenBalancesP

const currency = useSelectedCurrency()

const { combinedStakeInfo: subtensor } = useCombineBittensorStakeInfo({
address: account?.address,
balances: tokenBalances,
})

const detailRows = useMemo((): DetailRow[] => {
if (!summary) return []

Expand Down Expand Up @@ -123,26 +130,10 @@ export const useChainTokenBalances = ({ chainId, balances }: ChainTokenBalancesP
})),
)

// STAKED (SUBTENSOR)
const subtensor = tokenBalances.each.flatMap((b) =>
b.subtensor.map((subtensor, index) => ({
key: `${b.id}-subtensor-${index}`,
title: getLockTitle(subtensor, { balance: b }),

description: undefined,
tokens: BigNumber(subtensor.amount.tokens),
fiat: subtensor.amount.fiat(currency),
locked: true,
// only show address when we're viewing balances for all accounts
address: account ? undefined : b.address,
meta: subtensor.meta,
})),
)

return [...available, ...locked, ...reserved, ...staked, ...crowdloans, ...subtensor]
.filter((row) => row && row.tokens.gt(0))
.sort(sortBigBy("tokens", true))
}, [summary, account, t, tokenBalances, currency])
}, [summary, account, t, tokenBalances.each, subtensor, currency])

const { evmNetwork } = balances.sorted[0]
const relay = useChain(chain?.relay?.id)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import { Trans, useTranslation } from "react-i18next"

import { Balances } from "@extension/core"
import { Fiat } from "@ui/domains/Asset/Fiat"
import { NomPoolBondPillButton } from "@ui/domains/Staking/NomPoolBond/NomPoolBondPillButton"
import { useNomPoolBondButton } from "@ui/domains/Staking/NomPoolBond/useNomPoolBondButton"
import { BondPillButton } from "@ui/domains/Staking/Bond/BondPillButton"
import { useBondButton } from "@ui/domains/Staking/Bond/useBondButton"
import { useShowStakingBanner } from "@ui/domains/Staking/useShowStakingBanner"
import { useAnalytics } from "@ui/hooks/useAnalytics"
import { useBalancesStatus } from "@ui/hooks/useBalancesStatus"
Expand Down Expand Up @@ -82,7 +82,7 @@ export const AssetRow = ({ balances }: AssetRowProps) => {
const isUniswapV2LpToken = token?.type === "evm-uniswapv2"
const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances)

const { canBondNomPool } = useNomPoolBondButton({ tokenId: token?.id, balances })
const { canBondNomPool } = useBondButton({ tokenId: token?.id, balances })

const stakingReminder = useShowStakingBanner(balances)

Expand Down Expand Up @@ -147,7 +147,7 @@ export const AssetRow = ({ balances }: AssetRowProps) => {
<div className="flex h-[6.6rem] flex-col items-end justify-center gap-2 text-right">
{canBondNomPool && (
<>
<NomPoolBondPillButton
<BondPillButton
tokenId={token.id}
balances={balances}
className="[>svg]:text-[2rem] mr-8 hidden text-base group-hover:block"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ import { FadeIn } from "@talisman/components/FadeIn"
import { useOpenClose } from "@talisman/hooks/useOpenClose"
import { Fiat } from "@ui/domains/Asset/Fiat"
import Tokens from "@ui/domains/Asset/Tokens"
import { NomPoolBondPillButton } from "@ui/domains/Staking/NomPoolBond/NomPoolBondPillButton"
import { useNomPoolBondButton } from "@ui/domains/Staking/NomPoolBond/useNomPoolBondButton"
import { BondPillButton } from "@ui/domains/Staking/Bond/BondPillButton"
import { useBondButton } from "@ui/domains/Staking/Bond/useBondButton"
import { useAnalytics } from "@ui/hooks/useAnalytics"
import { useBalancesStatus } from "@ui/hooks/useBalancesStatus"
import { useNavigateWithQuery } from "@ui/hooks/useNavigateWithQuery"
Expand Down Expand Up @@ -88,7 +88,7 @@ const AssetRow = ({ balances, locked }: AssetRowProps) => {
const isUniswapV2LpToken = token?.type === "evm-uniswapv2"
const tvl = useUniswapV2LpTokenTotalValueLocked(token, rate, balances)

const { canBondNomPool } = useNomPoolBondButton({ tokenId: token?.id, balances })
const { canBondNomPool } = useBondButton({ tokenId: token?.id, balances })
const showStakingButton = canBondNomPool && !locked

if (!token || !summary) return null
Expand Down Expand Up @@ -164,7 +164,7 @@ const AssetRow = ({ balances, locked }: AssetRowProps) => {
{fiat === null ? "-" : <Fiat amount={fiat} isBalance />}
</div>
{showStakingButton && (
<NomPoolBondPillButton
<BondPillButton
tokenId={token.id}
balances={balances}
className="hidden group-hover:block"
Expand Down
Loading
Loading