diff --git a/assets/CalendarBlank.svg b/assets/CalendarBlank.svg new file mode 100644 index 0000000000..9d2830d8fc --- /dev/null +++ b/assets/CalendarBlank.svg @@ -0,0 +1,3 @@ + + + diff --git a/components/If.tsx b/components/If.tsx index f67cc57839..52657663fe 100644 --- a/components/If.tsx +++ b/components/If.tsx @@ -1,9 +1,9 @@ -import {ReactElement, useEffect, useState} from "react"; +import {ReactNode, useEffect, useState} from "react"; interface IfProps { condition: boolean | (() => boolean); - otherwise?: ReactElement; - children: ReactElement; + otherwise?: ReactNode; + children: ReactNode; } export default function If({condition, children, otherwise}: IfProps) { diff --git a/components/bounties/list-recent-issues.tsx b/components/bounties/list-recent-issues.tsx index 2aab5ffc41..295798e7ec 100644 --- a/components/bounties/list-recent-issues.tsx +++ b/components/bounties/list-recent-issues.tsx @@ -1,8 +1,12 @@ -import { useEffect, useState } from "react"; +import { useEffect, useReducer } from "react"; import { useTranslation } from "next-i18next"; +import { useRouter } from "next/router"; + +import PlusIcon from "assets/icons/plus-icon"; import LoadingList from "components/bounties/loading-list"; +import ContractButton from "components/contract-button"; import CustomContainer from "components/custom-container"; import IssueListItem from "components/issue-list-item"; import NothingFound from "components/nothing-found"; @@ -12,42 +16,126 @@ import { IssueBigNumberData } from "interfaces/issue-data"; import useApi from "x-hooks/use-api"; import { useNetwork } from "x-hooks/use-network"; +interface BountiesStates { + openBounties?: IssueBigNumberData[]; + loadingOpenBounties?: boolean; + fundingBounties?: IssueBigNumberData[]; + loadingFundingBounties?: boolean; +} + export default function ListRecentIssues() { const { t } = useTranslation(["bounty"]); + const { push } = useRouter(); + + const [bounties, updateBounties] = useReducer((prev: BountiesStates, next: Partial) => { + return { ...prev, ...next }; + }, + { + openBounties: [], + loadingOpenBounties: false, + loadingFundingBounties: false, + fundingBounties: [], + }); - const [loading, setLoading] = useState(false); - const [bounties, setBounties] = useState(); - const { networkName } = useNetwork(); const { searchRecentIssues } = useApi(); - useEffect(() => { + function numberOfColumns(numberBounties: number) { + if (numberBounties === 1) return 8; + if (numberBounties === 2) return 4; + + return 12; + } + + async function handleSearchRecentIssues(type: "open" | "funding") { + const isOpen = type === "open"; + const setLoading = (state: boolean) => + updateBounties(isOpen + ? { loadingOpenBounties: state } + : { loadingFundingBounties: state }); + const setBounties = (data: IssueBigNumberData[]) => + updateBounties(isOpen ? { openBounties: data } : { fundingBounties: data }); + setLoading(true); - searchRecentIssues({ networkName }) + searchRecentIssues({ networkName, state: type }) .then(setBounties) - .catch(err => { + .catch((err) => { console.debug(err); setLoading(false); }) .finally(() => setLoading(false)); + } + + useEffect(() => { + handleSearchRecentIssues("open"); + handleSearchRecentIssues("funding"); }, [networkName]); - return ( - -
-

{t("recent-bounties")}

-
- - -
- {bounties && - bounties?.map((bounty) => ( -
- -
- ))} - {bounties?.length === 0 && } + function renderNothingFound(type: "open" | "funding") { + const isOpen = type === "open"; + const lenBounties = isOpen + ? bounties.openBounties?.length + : bounties.fundingBounties?.length || 0; + + return ( +
+ +
+ push('/create-bounty')} + textClass="text-white-50" + className="read-only-button bg-gray-850 border-gray-850 mt-3" + > + + {isOpen ? t("create-bounty") : t("create-funding")} + +
+
- + ); + } + + function renderBounties(type: "open" | "funding") { + const isOpen = type === "open"; + + const currentBounties = isOpen + ? bounties.openBounties + : bounties.fundingBounties; + const loadingState = isOpen + ? bounties.loadingOpenBounties + : bounties.loadingFundingBounties; + + return ( + +
+

+ {isOpen ? t("recent-bounties") : t("recent-funding")} +

+
+ + +
+ {currentBounties && + currentBounties?.map((bounty) => ( +
+ +
+ ))} + {currentBounties?.length < 3 && + !loadingState && + renderNothingFound(isOpen ? "open" : "funding")} +
+
+ ); + } + + return ( + <> + {renderBounties("open")} + {renderBounties("funding")} + ); } diff --git a/components/contextual-span.tsx b/components/contextual-span.tsx index 49321c8842..e9aeae850b 100644 --- a/components/contextual-span.tsx +++ b/components/contextual-span.tsx @@ -1,4 +1,4 @@ -import { ReactNode, SVGProps } from "react"; +import { ReactNode, SVGProps, useState } from "react"; import clsx from "clsx"; @@ -7,7 +7,9 @@ import InfoIconEmpty from "assets/icons/info-icon-empty"; import SuccessIcon from "assets/icons/success-icon"; import WarningIcon from "assets/icons/warning-icon"; -import { FlexRow } from "components/profile/wallet-balance"; +import Button from "components/button"; +import If from "components/If"; +import { FlexColumn, FlexRow } from "components/profile/wallet-balance"; interface ContextualSpanProps { children: ReactNode; @@ -16,6 +18,7 @@ interface ContextualSpanProps { className?: string; classNameIcon?: string; isAlert?: boolean; + isDismissable?: boolean; } export function ContextualSpan({ @@ -25,11 +28,16 @@ export function ContextualSpan({ className = "", isAlert, classNameIcon, + isDismissable = false }: ContextualSpanProps) { + const [visible, setVisible] = useState(true); + const contextColor = color || context; - const CLASSES = clsx("p family-Regular font-weight-medium border-radius-4 align-items-center mx-0 px-1", - `text-${contextColor} ${className}`, - isAlert && `bg-${contextColor}-25 py-2 border border-${contextColor}`); + const CLASSES = clsx([ + "p family-Regular font-weight-medium border-radius-4 align-items-center mx-0", + `text-${contextColor} ${className}`, + isAlert && `bg-${contextColor}-25 p-3 border border-${contextColor} border-radius-8 justify-content-between` + ]); const Icon = (props: SVGProps) => { const icons = { @@ -43,12 +51,36 @@ export function ContextualSpan({ return icons[context](props); }; + function hide() { + setVisible(false); + } + + if (isAlert && isDismissable && !visible) + return <>; + return( - - - - {children} + + + + + + + {children} + + + + + + + + ); } \ No newline at end of file diff --git a/components/custom-network/new-network-stepper.tsx b/components/custom-network/new-network-stepper.tsx index c4bd9afed8..58f079e763 100644 --- a/components/custom-network/new-network-stepper.tsx +++ b/components/custom-network/new-network-stepper.tsx @@ -61,7 +61,7 @@ function NewNetwork() { const { tokensLocked, details, github, tokens, settings, isSettingsValidated, cleanStorage } = useNetworkSettings(); const isSetupPage = router?.pathname?.toString()?.includes("setup"); - + const creationSteps = [ { id: 1, name: t("custom-network:modals.loader.steps.deploy-network") }, { id: 1, name: t("custom-network:modals.loader.steps.changing-draft-time") }, @@ -102,7 +102,7 @@ function NewNetwork() { colors: JSON.stringify(settings.theme.colors), logoIcon: await psReadAsText(details.iconLogo.value.raw), fullLogo: await psReadAsText(details.fullLogo.value.raw), - repositories: + repositories: JSON.stringify(github.repositories .filter((repo) => repo.checked) .filter((repo) => repo?.userPermission === "ADMIN") @@ -147,7 +147,7 @@ function NewNetwork() { setCreatingNetwork(1); await handleChangeNetworkParameter("draftTime", draftTime, deployedNetworkAddress); } - + if (disputableTime !== DEFAULT_DISPUTE_TIME) { setCreatingNetwork(2); await handleChangeNetworkParameter("disputableTime", disputableTime, deployedNetworkAddress); @@ -199,10 +199,10 @@ function NewNetwork() { setCreatingNetwork(10); cleanStorage?.(); - await processEvent(RegistryEvents.NetworkRegistered, state.connectedChain?.registry, { - fromBlock: registrationTx.blockNumber + await processEvent(RegistryEvents.NetworkRegistered, state.connectedChain?.registry, { + fromBlock: registrationTx.blockNumber }) - .then(() => router.push(getURLWithNetwork("/", { + .then(() => router.push(getURLWithNetwork("/", { network: payload.name, chain: state.connectedChain?.shortName }))) @@ -223,7 +223,7 @@ function NewNetwork() { function checkHasNetwork() { dispatch(changeLoadState(true)); - + state.Service?.active.getNetworkAdressByCreator(state.currentUser.walletAddress) .then(networkAddress => setHasNetwork(!isZeroAddress(networkAddress))) .catch(console.debug) @@ -234,12 +234,10 @@ function NewNetwork() { const walletAddress = state.currentUser?.walletAddress; const connectedChain = state.connectedChain; - if (!state.Service?.active || !walletAddress || !connectedChain) return; - - if (walletAddress && connectedChain.name === UNSUPPORTED_CHAIN) { - dispatch(changeNeedsToChangeChain(true)); - return; - } + if (!state.Service?.active || + !walletAddress || + !connectedChain || + connectedChain?.name === UNSUPPORTED_CHAIN) return; checkHasNetwork(); }, [state.Service?.active, state.currentUser, state.connectedChain]); diff --git a/components/delegation-item.tsx b/components/delegation-item.tsx index 8f808aab5e..8b122bd7a3 100644 --- a/components/delegation-item.tsx +++ b/components/delegation-item.tsx @@ -1,9 +1,9 @@ import {useState} from "react"; +import BigNumber from "bignumber.js"; import {useTranslation} from "next-i18next"; -import OracleIcon from "assets/icons/oracle-icon"; - +import Indicator from "components/indicator"; import Modal from "components/modal"; import TokenBalance from "components/profile/token-balance"; @@ -20,13 +20,17 @@ import useBepro from "x-hooks/use-bepro"; interface DelegationProps { type: "toMe" | "toOthers"; tokenName: string; + tokenColor?: string; delegation?: DelegationExtended; + variant?: "network" | "multi-network"; } export default function DelegationItem({ type, tokenName, - delegation + delegation, + variant = "network", + tokenColor }: DelegationProps) { const { t } = useTranslation(["common", "profile"]); @@ -39,15 +43,18 @@ export default function DelegationItem({ const { updateWalletBalance } = useAuthentication(); - const delegationAmount = delegation?.amount?.toFixed() || "0"; + const isNetworkVariant = variant === "network"; + const delegationAmount = BigNumber(delegation?.amount)?.toFixed() || "0"; const tokenBalanceType = type === "toMe" ? "oracle" : "delegation"; const oracleToken = { - symbol: t("$oracles", {token: state.Service?.network?.active?.networkToken?.symbol}), - name: t("profile:oracle-name-placeholder"), - icon: + symbol: state.Service?.network?.active?.networkToken?.symbol || t("misc.token"), + name: state.Service?.network?.active?.networkToken?.name || t("profile:oracle-name-placeholder"), + icon: }; + const votesSymbol = t("token-votes", { token: oracleToken?.symbol }) + function handleShow() { setShow(true); } @@ -67,15 +74,17 @@ export default function DelegationItem({ } return ( - <> + <> {t("actions.take-back")} - {formatStringToCurrency(delegationAmount)} {t("$oracles", { - token: state.Service?.network?.active?.networkToken?.symbol - })} + {formatStringToCurrency(delegationAmount)} {t("misc.votes")} {t("misc.from")} {truncateAddress(delegation?.to || "", 12, 3)} diff --git a/components/delegations.tsx b/components/delegations.tsx index 4ec368040d..1b7ed73385 100644 --- a/components/delegations.tsx +++ b/components/delegations.tsx @@ -1,90 +1,126 @@ import BigNumber from "bignumber.js"; +import clsx from "clsx"; import {useTranslation} from "next-i18next"; -import OracleIcon from "assets/icons/oracle-icon"; - import DelegationItem from "components/delegation-item"; +import Indicator from "components/indicator"; +import InfoTooltip from "components/info-tooltip"; +import {FlexRow} from "components/profile/wallet-balance"; + +import {useAppState} from "contexts/app-state"; import {formatStringToCurrency} from "helpers/formatNumber"; -import {useAppState} from "../contexts/app-state"; -import InfoTooltip from "./info-tooltip"; -import {FlexRow} from "./profile/wallet-balance"; +import { Delegation } from "interfaces/curators"; +import { DelegationExtended } from "interfaces/oracles-state"; interface DelegationsProps { type?: "toMe" | "toOthers"; + delegations?: Delegation[]; + variant?: "network" | "multi-network"; + tokenColor?: string; } +type JoinedDelegation = Delegation | DelegationExtended; + export default function Delegations({ - type = "toMe" + type = "toMe", + delegations, + variant = "network", + tokenColor } : DelegationsProps) { const { t } = useTranslation(["common", "profile", "my-oracles"]); const {state} = useAppState(); - const walletDelegations = state.currentUser?.balance?.oracles?.delegations || []; + + const walletDelegations = + (delegations || state.currentUser?.balance?.oracles?.delegations || []) as JoinedDelegation[]; + const totalAmountDelegations = + walletDelegations.reduce((acc, delegation) => BigNumber(delegation.amount).plus(acc), BigNumber(0)).toFixed(); + + const votesSymbol = t("token-votes", { token: state.Service?.network?.active?.networkToken.symbol }) const renderInfo = { toMe: { title: t("profile:deletaged-to-me"), - description: - t("my-oracles:descriptions.oracles-delegated-to-me", { + description: + t("my-oracles:descriptions.oracles-delegated-to-me", { token: state.Service?.network?.active?.networkToken?.symbol }), total: undefined, - delegations: [ state.currentUser?.balance?.oracles?.delegatedByOthers || 0 ] + delegations: walletDelegations || [ state.currentUser?.balance?.oracles?.delegatedByOthers || 0 ] }, toOthers: { title: t("profile:deletaged-to-others"), - total: formatStringToCurrency(walletDelegations.reduce((acc, delegation) => - delegation.amount.plus(acc), BigNumber(0)).toFixed()), - description: - t("my-oracles:descriptions.oracles-delegated-to-others", { + total: formatStringToCurrency(totalAmountDelegations), + description: + t("my-oracles:descriptions.oracles-delegated-to-others", { token: state.Service?.network?.active?.networkToken?.symbol }), - delegations: state.currentUser?.balance?.oracles?.delegations || [] + delegations: walletDelegations || state.currentUser?.balance?.oracles?.delegations || [] } }; const oracleToken = { - symbol: t("$oracles", { token: state.Service?.network?.active?.networkToken?.symbol }), - name: t("profile:oracle-name-placeholder"), - icon: + symbol: state.Service?.network?.active?.networkToken?.symbol || t("misc.token"), + name: state.Service?.network?.active?.networkToken?.name || t("profile:oracle-name-placeholder"), + icon: }; const networkTokenName = state.Service?.network?.active?.networkToken?.name || oracleToken.name; + function getTextColorProps() { + if (tokenColor) + return { + style: { + color: tokenColor + } + }; + + return { + className: "text-primary" + }; + } + return (
- - {renderInfo[type].title} + + {renderInfo[type].title} + + + + + {formatStringToCurrency(renderInfo[type].total)} + + + + {votesSymbol} + + - - - { renderInfo[type].total !== undefined && - - {t("misc.total")} - - {formatStringToCurrency(renderInfo[type].total)} - - - } +
{ (type === "toOthers" && !renderInfo[type].delegations?.length) && t("my-oracles:errors.no-delegates") } - { (type === "toMe" || !!renderInfo[type].delegations?.length) && - renderInfo[type].delegations.map(delegation => + { (type === "toMe" || !!renderInfo[type].delegations?.length) && + renderInfo[type].delegations.map(delegation => ) }
diff --git a/components/divider.tsx b/components/divider.tsx index da9dba191f..cb73330077 100644 --- a/components/divider.tsx +++ b/components/divider.tsx @@ -1,7 +1,7 @@ -export function Divider() { +export function Divider({ bg = "disabled" }) { return(
-
+
); } \ No newline at end of file diff --git a/components/indicator.tsx b/components/indicator.tsx index 16598b1fea..bc2d7d883a 100644 --- a/components/indicator.tsx +++ b/components/indicator.tsx @@ -1,11 +1,17 @@ -export default function Indicator({ bg = "gray" }) { +export default function Indicator({ bg = "gray", size = "sm" }) { + const sizes = { + sm: ".5rem", + md: "1rem", + lg: "1.5rem" + }; + return ( <> diff --git a/components/info-tooltip.tsx b/components/info-tooltip.tsx index 6a205950f9..df36e9dde8 100644 --- a/components/info-tooltip.tsx +++ b/components/info-tooltip.tsx @@ -20,7 +20,7 @@ export default function InfoTooltip({ return ( - + {!secondaryIcon ? ( () const debounce = useRef(null) - + const id = kebabCase(typeof label === 'string' ? label : ""); const errorStyle = { "text-danger bg-opacity-100": error }; const successStyle = { "text-success bg-opacity-100": success }; @@ -46,7 +46,7 @@ export default function InputNumber({ setInputValue(e?.target?.value || null) clearTimeout(debounce.current) - + debounce.current = setTimeout(() => { onValueChange?.(e) }, 500) @@ -58,7 +58,7 @@ export default function InputNumber({ {label && typeof label === 'string' ? (
{helperText && (
state.Service?.active?.getTimeChain().then(setChainTime).catch(console.log); + const getChainTime = () => state?.Service?.active?.getTimeChain().then(setChainTime).catch(console.log); const { isClosed, isCanceled, isDraft, isFundingRequest, isFunded } = state.currentBounty?.data || {}; diff --git a/components/leaderboard/leaderboard-list-item.tsx b/components/leaderboard/leaderboard-list-item.tsx index 7d99a62008..5146f1730b 100644 --- a/components/leaderboard/leaderboard-list-item.tsx +++ b/components/leaderboard/leaderboard-list-item.tsx @@ -51,7 +51,7 @@ export default function LeaderBoardListItem({ user }: LeaderBoardListItemProps)
- {user?.githubHandle || "-"} + {user?.githubLogin || "-"}
diff --git a/components/list-issues.tsx b/components/list-issues.tsx index 1883345080..10f475bc8d 100644 --- a/components/list-issues.tsx +++ b/components/list-issues.tsx @@ -297,7 +297,7 @@ export default function ListIssues({ )} {isRenderFilter() ? (
diff --git a/components/nothing-found.tsx b/components/nothing-found.tsx index 22c867ab23..9cb9cf5a5b 100644 --- a/components/nothing-found.tsx +++ b/components/nothing-found.tsx @@ -2,20 +2,31 @@ import React, { ReactNode } from "react"; import NotFoundIcon from "assets/icons/not-found-icon"; -type NothingFoundProps = { +interface NothingFoundProps { description: string; children?: ReactNode; -}; + type?: "default" | "dashed"; +} export default function NothingFound({ + type = "default", description, - children + children, }: NothingFoundProps) { + const divClass = `d-flex flex-column ${ + type === "default" + ? "align-items-center gap-4 mt-3" + : "justify-content-center p-3 border-dashed bg-gray-900 border-radius-8 min-h-card" + }`; + const descriptionClass = `mb-0 text-center ${ + type === "default" ? "caption-small text-gray" : "text-white-50" + } `; + return ( -
- -

{description}

+
+ {type === "default" && } +

{description}

{children}
); -} \ No newline at end of file +} diff --git a/components/oracles-actions.tsx b/components/oracles-actions.tsx index ccc506dd5d..66f5585fef 100644 --- a/components/oracles-actions.tsx +++ b/components/oracles-actions.tsx @@ -60,7 +60,7 @@ function OraclesActions({ const networkTokenSymbol = networkTokenERC20.symbol || t("misc.$token"); const networkTokenDecimals = networkTokenERC20.decimals || 18; const oracleExchangeRate = Service?.network?.amounts?.oracleExchangeRate || 1; - const oracleAmount = action === t("my-oracles:actions.lock.label") ? + const oracleAmount = action === t("my-oracles:actions.lock.label") ? BigNumber(tokenAmount || 0).multipliedBy(oracleExchangeRate).toFixed() : BigNumber(tokenAmount || 0).dividedBy(oracleExchangeRate).toFixed(); @@ -74,29 +74,29 @@ function OraclesActions({ const renderInfo = { Lock: { title: t("my-oracles:actions.lock.title", { currency: networkTokenSymbol }), - description: - t("my-oracles:actions.lock.description", { - currency: networkTokenSymbol, + description: + t("my-oracles:actions.lock.description", { + currency: networkTokenSymbol, token: Service?.network?.active?.networkToken?.symbol }), label: t("my-oracles:actions.lock.get-amount-oracles", { - amount: formatNumberToNScale(oracleAmount), + amount: formatNumberToNScale(oracleAmount, undefined, ""), token: Service?.network?.active?.networkToken?.symbol }), caption: ( <> {t("misc.get")} - {t("$oracles", { token: Service?.network?.active?.networkToken?.symbol })} + {t("misc.votes")} {" "} {t("misc.from")} {networkTokenSymbol} ), - body: - t("my-oracles:actions.lock.body", { - amount: formatNumberToNScale(tokenAmount), - oracleAmount: formatNumberToNScale(oracleAmount), + body: + t("my-oracles:actions.lock.body", { + amount: formatNumberToNScale(tokenAmount, undefined, ""), + oracleAmount: formatNumberToNScale(oracleAmount, undefined, ""), currency: networkTokenSymbol, token: Service?.network?.active?.networkToken?.symbol }), @@ -105,10 +105,10 @@ function OraclesActions({ } }, Unlock: { - title: + title: t("my-oracles:actions.unlock.title", { currency: networkTokenSymbol }), - description: - t("my-oracles:actions.unlock.description", { + description: + t("my-oracles:actions.unlock.description", { currency: networkTokenSymbol, token: Service?.network?.active?.networkToken?.symbol }), @@ -126,7 +126,7 @@ function OraclesActions({ ), - body: t("my-oracles:actions.unlock.body", { + body: t("my-oracles:actions.unlock.body", { amount: formatNumberToNScale(tokenAmount), oracleAmount: formatNumberToNScale(oracleAmount), currency: networkTokenSymbol, @@ -204,7 +204,7 @@ function OraclesActions({ function getCurrentLabel() { return action === t("my-oracles:actions.lock.label") ? networkTokenSymbol - : t("$oracles", { token: Service?.network?.active?.networkToken?.symbol }); + : t("token-votes", { token: "" }); } function getMaxAmount(trueValue = false): string { @@ -218,7 +218,7 @@ function OraclesActions({ if (trueValue) return amount; - return formatNumberToNScale(amount); + return formatNumberToNScale(amount, undefined, ""); } function setMaxAmount() { @@ -231,7 +231,7 @@ function OraclesActions({ : TransactionTypes.unlock; } - const needsApproval = () => + const needsApproval = () => networkTokenERC20.allowance.isLessThan(tokenAmount) && action === t("my-oracles:actions.lock.label"); useEffect(() => { @@ -242,27 +242,28 @@ function OraclesActions({ return ( <>
-
+
-

+

{renderInfo?.description}

{t("misc.max")} diff --git a/components/oracles-box-header.tsx b/components/oracles-box-header.tsx index 4af598bc62..8926c41977 100644 --- a/components/oracles-box-header.tsx +++ b/components/oracles-box-header.tsx @@ -38,7 +38,7 @@ function OraclesBoxHeader({ active: action === currentAction })} > -

{action}

+

{action}

)) )} diff --git a/components/oracles-delegate.tsx b/components/oracles-delegate.tsx index d158331ab2..c335fd0624 100644 --- a/components/oracles-delegate.tsx +++ b/components/oracles-delegate.tsx @@ -32,7 +32,7 @@ function OraclesDelegate({ defaultAddress }: OraclesDelegateProps) { const {t} = useTranslation(["common", "my-oracles"]); - + const debounce = useRef(null); const [error, setError] = useState(""); @@ -70,7 +70,7 @@ function OraclesDelegate({ if(Service?.active?.web3Connection && params.target.value){ clearTimeout(debounce.current) - + debounce.current = setTimeout(() => { const isValid = Service.active.isAddress(params.target.value) if(!isValid) setAddressError(t("my-oracles:errors.invalid-wallet")); @@ -96,7 +96,7 @@ function OraclesDelegate({ processEvent(NetworkEvents.OraclesTransfer, undefined, { fromBlock: blockNumber }) .catch(console.debug); } - + const isButtonDisabled = (): boolean => [ wallet?.balance?.oracles?.locked?.lt(tokenAmount), @@ -121,21 +121,22 @@ function OraclesDelegate({ return (
-
+
-

- {t("my-oracles:actions.delegate.description", { token: networkTokenSymbol })} +

+ {t("my-oracles:actions.delegate.description")}

{formatNumberToNScale(availableAmount?.toString() || 0, 2, '')}{" "} - {`${t("$oracles", { token: networkTokenSymbol })} ${t("misc.available")}`} + {t("misc.votes")}
-