diff --git a/apps/token/src/hooks/use-get-user-tranche-balances.ts b/apps/token/src/hooks/use-get-user-tranche-balances.ts index 959be64c4..56787d39c 100644 --- a/apps/token/src/hooks/use-get-user-tranche-balances.ts +++ b/apps/token/src/hooks/use-get-user-tranche-balances.ts @@ -7,20 +7,24 @@ import { useAppState, } from '../contexts/app-state/app-state-context'; import { BigNumber } from '../lib/bignumber'; +import { useTranches } from './use-tranches'; export const useGetUserTrancheBalances = ( address: string, vesting: VegaVesting ) => { const { appDispatch } = useAppState(); + const { tranches } = useTranches(); return React.useCallback(async () => { appDispatch({ type: AppStateActionType.SET_TRANCHE_ERROR, error: null, }); try { - const tranches = await vesting.getAllTranches(); - const userTranches = tranches.filter((t) => + if (!tranches) { + return; + } + const userTranches = tranches?.filter((t) => t.users.some( ({ address: a }) => a && address && a.toLowerCase() === address.toLowerCase() @@ -52,5 +56,5 @@ export const useGetUserTrancheBalances = ( error: e as Error, }); } - }, [address, appDispatch, vesting]); + }, [address, appDispatch, tranches, vesting]); }; diff --git a/apps/token/src/hooks/use-tranches.ts b/apps/token/src/hooks/use-tranches.ts index e85d0d231..e91f57754 100644 --- a/apps/token/src/hooks/use-tranches.ts +++ b/apps/token/src/hooks/use-tranches.ts @@ -1,29 +1,66 @@ -import React from 'react'; -import * as Sentry from '@sentry/react'; -import type { Tranche } from '@vegaprotocol/smart-contracts-sdk'; +import { useFetch } from '@vegaprotocol/react-helpers'; +import type { Networks, Tranche } from '@vegaprotocol/smart-contracts-sdk'; +import React, { useEffect } from 'react'; +import { APP_ENV } from '../config'; -import { useContracts } from '../contexts/contracts/contracts-context'; +import { BigNumber } from '../lib/bignumber'; + +const TRANCHES_URLS: { [N in Networks]: string } = { + MAINNET: 'https://static.vega.xyz/assets/mainnet-tranches.json', + TESTNET: 'https://static.vega.xyz/assets/testnet-tranches.json', + STAGNET: 'https://static.vega.xyz/assets/stagnet1-tranches.json', + STAGNET2: 'https://static.vega.xyz/assets/stagnet2-tranches.json', + DEVNET: 'https://static.vega.xyz/assets/devnet-tranches.json', + CUSTOM: '', +}; export function useTranches() { - const { vesting } = useContracts(); const [tranches, setTranches] = React.useState(null); - const [error, setError] = React.useState(null); - - React.useEffect(() => { - const run = async () => { - try { - const res = await vesting.getAllTranches(); - setTranches(res); - } catch (err) { - Sentry.captureException(err); - setError((err as Error).message); - } - }; - run(); - }, [vesting]); + const url = React.useMemo(() => TRANCHES_URLS[APP_ENV], []); + const { + state: { data, loading, error }, + } = useFetch(url); + useEffect(() => { + const processedTrances = data + ?.map((t) => ({ + ...t, + tranche_start: new Date(t.tranche_start), + tranche_end: new Date(t.tranche_end), + total_added: new BigNumber(t.total_added), + total_removed: new BigNumber(t.total_removed), + locked_amount: new BigNumber(t.locked_amount), + deposits: t.deposits.map((d) => ({ + ...d, + amount: new BigNumber(d.amount), + })), + withdrawals: t.withdrawals.map((w) => ({ + ...w, + amount: new BigNumber(w.amount), + })), + users: t.users.map((u) => ({ + ...u, + // @ts-ignore - types are incorrect in the SDK lib + deposits: u.deposits.map((d) => ({ + ...d, + amount: new BigNumber(d.amount), + })), + // @ts-ignore - types are incorrect in the SDK lib + withdrawals: u.withdrawals.map((w) => ({ + ...w, + amount: new BigNumber(w.amount), + })), + total_tokens: new BigNumber(u.total_tokens), + withdrawn_tokens: new BigNumber(u.withdrawn_tokens), + remaining_tokens: new BigNumber(u.remaining_tokens), + })), + })) + .sort((a: Tranche, b: Tranche) => a.tranche_id - b.tranche_id); + setTranches(processedTrances ? processedTrances : null); + }, [data]); return { tranches, + loading, error, }; } diff --git a/apps/token/src/routes/claim/index.tsx b/apps/token/src/routes/claim/index.tsx index 131029104..0dbbe5f3b 100644 --- a/apps/token/src/routes/claim/index.tsx +++ b/apps/token/src/routes/claim/index.tsx @@ -10,15 +10,15 @@ import type { RouteChildProps } from '..'; import Claim from './claim'; import { ClaimRestricted } from './claim-restricted'; import { isRestricted } from './lib/is-restricted'; -import { Splash } from '@vegaprotocol/ui-toolkit'; +import { Callout, Intent, Splash } from '@vegaprotocol/ui-toolkit'; const ClaimIndex = ({ name }: RouteChildProps) => { useDocumentTitle(name); const { t } = useTranslation(); const { account } = useWeb3React(); - const { tranches } = useTranches(); + const { tranches, loading, error } = useTranches(); - if (!tranches) { + if (loading || !tranches) { return ( @@ -26,6 +26,14 @@ const ClaimIndex = ({ name }: RouteChildProps) => { ); } + if (error) { + return ( + + {error} + + ); + } + let content = null; if (!account) { diff --git a/apps/token/src/routes/home/token-details/token-details.tsx b/apps/token/src/routes/home/token-details/token-details.tsx index caa33fc20..2f4412afb 100644 --- a/apps/token/src/routes/home/token-details/token-details.tsx +++ b/apps/token/src/routes/home/token-details/token-details.tsx @@ -1,12 +1,18 @@ import { useTranslation } from 'react-i18next'; -import { EtherscanLink } from '@vegaprotocol/ui-toolkit'; +import { + Callout, + EtherscanLink, + Intent, + Splash, +} from '@vegaprotocol/ui-toolkit'; import { KeyValueTable, KeyValueTableRow } from '@vegaprotocol/ui-toolkit'; import { ADDRESSES } from '../../../config'; import { useTranches } from '../../../hooks/use-tranches'; import type { BigNumber } from '../../../lib/bignumber'; import { formatNumber } from '../../../lib/format-number'; import { TokenDetailsCirculating } from './token-details-circulating'; +import { SplashLoader } from '../../../components/splash-loader'; export const TokenDetails = ({ totalSupply, @@ -17,7 +23,24 @@ export const TokenDetails = ({ }) => { const { t } = useTranslation(); - const { tranches } = useTranches(); + const { tranches, loading, error } = useTranches(); + + if (error) { + return ( + + {error} + + ); + } + + if (!tranches || loading) { + return ( + + + + ); + } + return ( diff --git a/apps/token/src/routes/redemption/redemption.tsx b/apps/token/src/routes/redemption/redemption.tsx index 668745e52..38a6cf033 100644 --- a/apps/token/src/routes/redemption/redemption.tsx +++ b/apps/token/src/routes/redemption/redemption.tsx @@ -28,7 +28,7 @@ const RedemptionRouter = () => { appState: { trancheBalances }, } = useAppState(); const { account } = useWeb3React(); - const { tranches, error } = useTranches(); + const { tranches, error, loading } = useTranches(); React.useEffect(() => { const run = (address: string) => { @@ -59,7 +59,7 @@ const RedemptionRouter = () => { ); } - if (!tranches) { + if (!tranches || loading) { return ( diff --git a/apps/token/src/routes/tranches/index.tsx b/apps/token/src/routes/tranches/index.tsx index 52916bc88..297f7e564 100644 --- a/apps/token/src/routes/tranches/index.tsx +++ b/apps/token/src/routes/tranches/index.tsx @@ -6,14 +6,14 @@ import { SplashLoader } from '../../components/splash-loader'; import { useDocumentTitle } from '../../hooks/use-document-title'; import { useTranches } from '../../hooks/use-tranches'; import type { RouteChildProps } from '..'; -import { Splash } from '@vegaprotocol/ui-toolkit'; +import { Callout, Intent, Splash } from '@vegaprotocol/ui-toolkit'; const TrancheRouter = ({ name }: RouteChildProps) => { useDocumentTitle(name); const { t } = useTranslation(); - const { tranches } = useTranches(); + const { tranches, error, loading } = useTranches(); - if (!tranches) { + if (!tranches || loading) { return ( @@ -21,6 +21,14 @@ const TrancheRouter = ({ name }: RouteChildProps) => { ); } + if (error) { + return ( + + {error} + + ); + } + return ( <>